В приложении для обмена мгновенными сообщениями на мобильных устройствах пользователей имеется база данных типа 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, есть ли у меня все эти сообщения хранятся там. Но это кажется довольно неэффективным.
Как этот тип синхронизации обычно выполняется эффективным способом?