В доме простая синхронизация данных - PullRequest
0 голосов
/ 13 января 2010

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

Пожалуйста, помогите мне со следующим сценарием:

У меня будет SQL-сервер, на котором я буду хранить наборы данных. У меня также будет куча клиентов ПК (все со своим локальным сервером SQL), которые нужно будет синхронизировать с сервером. ПК будут однозначно идентифицированы.

Пример:

Допустим, у меня есть 2 клиента ПК, ПК1 и ПК2.

На сервере у меня есть следующие наборы данных:

DS1 DS2

На клиентских компьютерах мне не с чего начать. Когда ПК1 подключится к серверу, чтобы увидеть, «что-нибудь новое», он заметит, что ему нужно получить два набора данных, чтобы он обновил свою локальную базу данных с DS1 и DS2. То же самое произойдет с ПК2. Теперь, скажем, PC2 локально модифицирует DS2. Когда ПК2 подключится к серверу, он обновит DS2 на сервере с изменениями, внесенными в его локальный DS2. Наконец, когда ПК1 снова подключится, чтобы увидеть, есть ли какие-либо изменения, он заметит, что DS2 изменился, и извлечет его и перезапишет свой локальный DS2 с DS2 с сервера.

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

Я подумал о нескольких решениях, но они не кажутся очень эффективными; может быть, у кого-то еще будет несколько идей.

1-е решение:

На сервере я создам таблицу с именем «SyncTable», в которую я буду записывать любые изменения в наборы данных.

Пример: * * тысяча двадцать-пять

Допустим, ПК1 должен получить DS1, а ПК2 - DS4 и DS5.

Таблица синхронизации будет содержать:

PC1 DS1
PC2 DS4
PC2 DS5

Итак, когда PC2 подключается к серверу, он смотрит на эту таблицу, отмечает, что ему нужно загрузить DS4 и DS5, идет дальше и делает это, а затем удаляет свои две записи из таблицы сервера. Таким образом, таблица сервера будет содержать «PC1 DS1» только после синхронизации самой PC2. В следующий раз, когда подключается ПК2, он отмечает, что для него нет записей, и, таким образом, знает, что он "актуален". Когда ПК1 подключится, произойдет точно то же самое: он заметит, что ему нужно загрузить DS1, загрузить его и затем удалить запись.

Проблема в том, что если будет 10 000 ПК и, возможно, 5000 измененных наборов данных, у меня будет много записей в этой таблице.

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

Поэтому, у вас есть предложения по этому поводу?

Используемая технология: MS SQL Server Compact Edition 3.5 на клиентских ПК и MySQL на сервере. Связь будет осуществляться через веб-сервисы. Поэтому репликация слиянием / удаленный доступ к данным отсутствуют.

Спасибо!

1 Ответ

0 голосов
/ 13 января 2010

Вы рассматриваете два варианта

  1. генерируя список необходимых обновлений во время модификации, клиент спрашивает «что в моем списке обновлений»?
  2. хранение временных меток таким образом, чтобы клиент мог спросить: «Мое последнее время для DSx ..., мне нужно обновление?»

Я вижу вариант 2 как предпочтительный. Я думаю, что он более устойчив к проблемам, восстановлению после сбоев клиента и т. Д. Это потому, что каждый участник сохраняет только то, что он знает: дату своих данных. Серверу не нужно «понимать», кто что взял.

Я думаю, вы можете оптимизировать определение того, что загружать. Вы говорите так, как будто клиент должен перебирать все свои наборы данных, извлекать каждую отметку времени по одному и принимать решение для извлечения. Вместо этого вы можете получить вызов веб-службы:

I have DS1=<time>, DS2=<time> ...; which do I need to download?

Фактическое решение принимается сервером на основе данных, отправленных клиентом, а не клиентом, выбирающим данные, чтобы позволить ему принять само решение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...