Разработать утилиту для переброса данных от TCP-сервера в облако
Общее описание
Требуется разработать утилиту, которая будет пробрасывать данных от передатчика текстовых сообщений на TCP в облако по URL, за которым реализован WebSocket-сервер.
Общая архитектура
Telemetry Relay — Windows-сервис, утилита, работающая в фоновом режиме, которая забирает по TCP сообщения от программы телеметрии (доступна по локальной сети) по протоколу TCP и ретранслирует их в облако.
Telemetry Receiver — ресурс по URL (задается в конфигах), реализованный как WebSocket-сервер, который принимает сообщения и сохраняет в базу.
Требования к Telemetry Relay
- Запускается как сервис в Windows
- Настраивается через файл settings.ini в папке с программой
- Инсталлятор не требуется, буду просто копировать папку в Program Files самостоятельно
[telemetry]
telemetry_ip = 127.0.0.1
telemetry_port = 50000
telemetry_timeout = 60
[cloud]
cloud_url = https://example.ru/api/v3/telemetry/receiver/
cloud_timeout = 60
cloud_token = sdkjhadsfkjhdsfjhdsafkafk2332kjkj32dsdskaf
Таймауты указываются в секундах. При недоступности ресурса утилита бесконечно пытается подключиться.
Описание логики работы
1. Попытаться подключиться к TCP.
- При любых ошибках в подключении бесконечно продолжать пытаться подключиться с таймаутом из конфига.
- При успешном подключении к TCP начать слушать сообщения.
2. Попытаться подключиться к облаку.
- При подключении необходимо отправить заголовок "Authorization: Bearer CLOUD_TOKEN_FROM_SETTINGS_INI_FILE".
- При любых ошибках в подключении бесконечно продолжать пытаться подключиться с таймаутом из конфига.
- В случае успешного подключения по WebSocket, первым сообщением сервер пришлет сообщение {"lastInsertId":SOME_INTEGER_OR_ZERO}, которое будет означать последний полученный ID от данной точки (идентифицируется по токену).
- Прочитав lastInsertId, нужно в папке data найти сообщение с номером больше, чем lastInsertId и передать их скоупом в облако. Формат сообщения: {"id":SOME_INTEGER_ID, "message":"RAW_MESSAGE_FROM_TCP_SERVER"}
- Затем программа начинает работать в режиме прослушивания и ретранслирования (см. пункт №4).
3. При получении сообщения по TCP, разделить его по переводу строки (сообщение = отдельная строка с текстом, может быть кириллица), присвоить этому сообщению уникальный порядковый номер и сохранить полученное сообщение в папке data.
- В день будет набегать примерно 5 мегабайт данных.
- Данные за каждый день нужно складывать в отдельные файлы в таком формате — 2020-12-01.txt
- Сообщения в файлах нужно хранить в виде json'а. Структура json'а: {"id":SOME_INTEGER_ID, "message":"RAW_MESSAGE_FROM_TCP_SERVER"}.
4. Параллельно тому, как сообщения складываются на диск, необходимо как можно быстрее и с минимальной задержкой отправлять сообщения в облако по WebSocket.
- При ошибках на сервере будет разорвано подключение, поэтому пока подключение есть, значит сообщения успешно обрабатываются и например смещать внутренний указатель в программе последнего отправленного сообщения.
- Формат сообщения: {"id":SOME_INTEGER_ID, "message":"RAW_MESSAGE_FROM_TCP_SERVER"}
Другие важные требования
Наиболее критичным приоритетом работы программы является стабильное прослушивание всех сообщений без потерь (т.к. повторно отправить сообщение возможности не будет).
Следующим приоритетом является скорость отправки сообщения в облако — нужен лаг не более 0.5 с. В идеале 0.1-0.2 с.
При наличии сложностей, можно срезать углы и оптимизировать задачу, предварительно согласовав со мной подход.
Если что-то упущено — просьба дополнить, и бюджет на работу будет увеличен.