Клиент-сервер

shelestov

я тут часто
Есть у меня один homework для души на java.
Решил сделать в нем синхронизацию с сервером.
У приложения N пользователей, у каждого пользователя может быть N устройств. Все как обычно.
На клиенте SQLIte база, в ней 5 таблиц. Каждая запись каждой таблицы должна быть синхронизирована.
На сервере MySQL.

Сам процесс синхронизации - это обмен XML файлами. Клиент должен отправить свои локальные изменения, сервер вернуть изменения, полученные от других устройств с момента последней синхронизации текущего.

Собственно у меня мысль такая.
На клиенте для каждой записи в каждой таблице добавить 2 поля:
1. lastupdate (unixtimestamp)
2. is_delete (1/0)
Ну и хранить для всего клиента дату последней синхронизации lastsync.

При удалении записей удалять их физически только в том случае, если модификация локальна, т.е. lastupdate>lastsync, в противном случае скрывать полем is_delete=1 и не выводить.

После успешной синхронизации все записи с is_delete=1 физически удаляем.

Все остальные изменения просто отправляются на сервак где производится insert on duplicate update.

Вот сижу и думаю нормально ли такое решение, или же я что то не учел?
 

WMix

герр M:)ller
Партнер клуба
у 2х разных клиентов может быть одинаковый id - на клиенте было бы неплохо хранить id записей на сервере и ореентироваться на него. если null insert, иначе update.
при синхронизации лучше первым шагом создать временную табличку из экспорта, а вторым шагом проверять обновлять основную (так и узнаем что нужно удалить). ну и да last_update но это можно опустить и обновлять все.
 

shelestov

я тут часто
у 2х разных клиентов может быть одинаковый id - на клиенте было бы неплохо хранить id записей на сервере и ореентироваться на него. если null insert, иначе update.
Да, это я из вида упустил.
Если Id записей хранить на сервере, прийдется на клиенте к каждой добавлять некую привязку к ID на сервере, этакий server_id.


при синхронизации лучше первым шагом создать временную табличку из экспорта, а вторым шагом проверять обновлять основную (так и узнаем что нужно удалить). ну и да last_update но это можно опустить и обновлять все.
Тут я не понял.
Мне нужно, чтобы между клиентоми и сервером ходило минимальное кол-во данных, т.е. отправить всю базу на сервер для сверки не вариант.
 

zuxel

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

shelestov

я тут часто
мне кажется, при загрузке на сервер нельзя изменять id созданных на клиенте строк, т.к у каждого могут быть локальные данные завязанные на этот id
Это само собой. Поэтому хочу ввести server_id, хранимые на сервере для каждой записи.
 

WMix

герр M:)ller
Партнер клуба
Тут я не понял.
ну тогда через lastupdate, просто если делать пошагово, то проще сразу по акции отправить запрос на сервер. а скопом, то проще не париться с дополнительной логикой
zuxel
его нужно добавить а не заменить. id сервера это логика синхронизации а id записи это логика приложения
 
Последнее редактирование:

shelestov

я тут часто
Задумался об удаленных записях.
Как я понимаю прийдется мне все удаленные записи хранить на сервере "пожизненно", либо нужно регистрировать каждый клиент и удалять любую запись с сервера только если все клиенты синхронизировали это удаление?
 

WMix

герр M:)ller
Партнер клуба
при удалении на клиенте, ничего не удаляется а помечается как удаленная (в этом есть 2й смысл шаг назад и пометка). при синхронизации сервер запросит удаленные, удалит, и вернет список того что удалил, клиент удалит по списку у себя.
 

shelestov

я тут часто
По клиенту все понятно.
Клиентов может быть десяток.
Сервер у себя не может ничего удалить, как другие клиенты узнают, что запись удалена?

К примеру. Клиент 1 отправляет серверу данные о удалении 2-х записей. Сервер удаляет. Стучится 2-й клиент, говорит, дай изменения за последние 2 дня. Сервер должен ему сказать, что 2 записи были удалены первым клиентом и теперь и ему стоит их удалить и так N-клиентов.

Я думаю ставить пометку на сервере, но тогда я буду должен все записи хранить вечно :)
 
Последнее редактирование:

shelestov

я тут часто
От всего этого гемора может избавить вариант каждый раз отдавать клиенту полную копию актуальной базы, но тогда в среднем при каждом мелком изменении каждый клиент будет получать в среднем XML размером 1Mb.
 

cDLEON

Онанист РНРСlub
Количество клиентов большое ? Как насчёт хранения лога всех действий для каждого клиента ? Клиент забрал - удаляем его копию через какое то время. Если клиент очень стар - запускаем полную синхронизацию.
 

shelestov

я тут часто
cDLEON, думал об этом.
В принципе если делать полную синхронизацию для старых клиентов, то хранение лога действий для каждого не обязательно.
Клиент просто будет присылать дату последней своей синхронизации.
 
Сверху