Как организовать синхронизацию данных клиент-сервер для мобильного ios приложения?

Имеется клиент и сервер.
Сейчас каждый хранит свои данные, которые внесены отдельно на клиент и отдельно на сервер.
Данные могут создаваться/изменяться/удаляться на клиенте и на сервере.

Изменения можно (в целевой модели) осуществлять как на клиенте так и на сервере (из под одной учетной записи, либо админом).
Необходимо описать как правильно синхронизировать эти данные.

Чтобы нагляднее описать что требуется, возьмем к примеру приложение инстаграм.
Я сделал фотку в инстаграме - она видна у меня, потом на сервере и у моих друзей.
Кто-то написал комментарий через веб версию и он отразился у меня и у друзей.
Кто-то лайкнул у себя - и опять по цепочке все обновилось - лайкнувший юзер, сервер, я и друзья.
Я затер свой коммент у кого-то и он затерся у всех кто его мог видеть.

Как реализовать подобную схему синхронизации?
Что для этого нужно?

Поделитесь своей практикой и рабочими кейсами.
  • Вопрос задан
  • 10052 просмотра
Пригласить эксперта
Ответы на вопрос 3
deadbyelpy
@deadbyelpy
веб-шмеб
Делаем достаточно просто. Локальная структура хранит два идентификатора, один полностью локальный, другой - тот ид что пришел с сервера после создания.

Механизм такой: сделали что-то, есть подключение к инету?
ДА - отправляем на сервер - получили успешный ответ?
да - добавили в локальную базу с id который пришел с сервера.
нет - пишем в чем ошибка в лог, извиняемся перед пользователем (хотя схема другая,обычно все ок, и не ок только если сервер упал)
НЕТ - пишем в локальную базу, с пустым сервер ID

появляется подключение к сети
- отправляем порциями локальные объекты (если они до появления инета не были удалены) для получения нужных сервер ID
- запрашиваем список удаленных с сервера (авось под этой учеткой на другом устройстве чтото удалили) удаляем локальные объекты

UPD: может кто не догадается сразу, мало ли. Как только сервер получает данные, он сообщает по сокету всем пользователям которые онлайн и находятся в какой то связи с контентом пользователя что его делал
Ответ написан
@FoxInSox
У вас всего два метода синхронизации:
- http запрос который отправляет клиент для загрузки/отправки данных;
- PUSH уведомление которое отправляет сервер на клиент;

Пример:
1. Клиент А сделал фотографию.
2. Клиент А отправил фотографию на сервер.
3. Сервер получил фотографию
4. Сервер отправил PUSH уведомления клиентам B и C с инормацией "есть новое фото от клиента А"
5. Клиенты B и C получили уведомления.
5.1 Если пользователь(человек) находится в фото ленте, то клиент делает запрос на сервер, загружает фото и отображает ее.
5.2 Если пользователь находится, например, на экране настроек, то клиент отображает уведомление(тост) "есть новое фото от клиента А"
Ответ написан
ivanzoid
@ivanzoid
Можно попробовать CouchBase Lite couchbase.com/mobile . Сам правда пока не пробовал в реальных проектах, только присматриваюсь. А так вроде на вашу задачу хорошо ложится.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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