Как лучше производить синхронизацию с сервером при нестабильном интернете?

Есть 40-50 устройств, каждое из которых генерирует 3-7к записей в день.
Нужно сохранить все эти данные в БД на сервере, но у устройств невсегда есть стабильный интернет.
При этом устройству для работы необходимо около 1к записей с сервера (они могут изредка добавляться и изменяться).

На сервере хочу использовать postgresql. На устройствах можно тоже использовать postgresql или что то попроще (sqlite) и при появлении интернета синхронизировать их. При этом на устройствах сгенерированные данные после синхронизации хранить не нужно.
Как лучше это реализовать и что можно почитать на эту тему?
  • Вопрос задан
  • 252 просмотра
Решения вопроса 1
2ord
@2ord
Apache CouchDB позволяет автоматически синхронизировать между локальными инстансами у клиентов и инстансом сервера. Также позволяет работать в режиме оффлайн между сеансам обмена.

UPD
После получения дополнительной информации могу предложить другое решение.
На сервере хранить дату последнего сеанса синхронизации клиента.
Клиент должен хранить у себя таблицу с данными в колонках:
Дата, значение, айди клиента, айди параметра из конфигурации

Как только по таймеру пришло время отправлять данные, проверяем накопились ли данные в таблице. Выбираем X первых записей (допустим, 1000) и асинхронно пробуем отправить их на сервер. Если успешно, то удаляем из таблицы записи с выбранными ID. Если нет, то при следующей попытке согласно работе таймера отправляем данные с накопившимися изменениями.
В другом потоке, как только появились новые данные от датчиков, выполняем INSERT в таблицу.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@rPman
Нестабильный интернет бывает разным, но в общем случае решается прослойкой между клиентами и базой данных (обычное дело, да и ради повышения безопасности, в мир базу данных не открывают), время сейчас такое что наилучшее решение - http/https. В этом случае база данных может быть абсолютно любой, хоть текстовый лог хоть oracle.

При этом, если используется прослойка, вы можете организовывать репликацию и синхранизацию с несколькими вашими серверами самостоятельно, иногда это даже удобнее и проще чем городить штатную репликацию баз данных, особенно если интернет нестабильный. Т.е. при получении данных от устройств вы отправляете два/много запросов на ваши сервера (асинхронно само собой) и ждете отведенный таймаут (по которому отключаете сбойный сервер из списка и выдаете алерт) после чего отвечаете ок. При возврате в строй сервера, на него заливаются данные с рабочих (лог или поле со временем, если данные не удаляются).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы