Синхронизация неотправленных сообщений от сервера к клиенту с локальной базой данных - PullRequest
0 голосов
/ 24 марта 2020

В приложении для обмена мгновенными сообщениями на мобильных устройствах пользователей имеется база данных типа SQLite для автономного хранения, а на сервере - Postgres для холодного хранения и Redis для хранения последних сообщений X.

Когда Пользователь не в сети, я хочу синхронизировать c новые сообщения с SQLite, используя отправленное им уведомление pu sh. И затем, когда они go онлайн, проверьте у сервера, есть ли какие-то сообщения, которые он не получил.

Как это можно сделать эффективно?

Пример + полу -solution:

Когда пользователь не в сети, я отправляю пользователю сообщения FCM с новыми отправленными им сообщениями. Это означает, что приложение может обновлять локальную базу данных SQLite этими новыми сообщениями, даже если я не показываю само уведомление (если пользователь отказался от их получения).

Сначала я думал о сохранении в последний раз SQLite обновлялся, а затем при установлении соединения (websocket) проверял и извлекал все сообщения (если они были) с этой отметки времени на сервере.

Но уведомления pu sh являются чем-то довольно ненадежным, и FCM может пропускать или отправлять сообщения с большой задержкой.

Например, представьте, что мы отправили сообщения A, B, C через FCM pu sh, а B по какой-то причине пропускает FCM. Это означает, что будет установлена ​​временная метка C, и тогда сервер подумает: «Хорошо, у пользователя есть все сообщения вплоть до временной метки C, поэтому нет смысла отправлять ему что-либо до этого». Таким образом, B никогда не дойдет до пользователя.

Я мог бы решить эту проблему, извлекая ВСЕ сообщения за последний раз, когда пользователь был в сети, и затем проверять их приложение локально по SQLite, есть ли у меня все эти сообщения хранятся там. Но это кажется довольно неэффективным.

Как этот тип синхронизации обычно выполняется эффективным способом?

...