Есть ли шаблон для синхронизации списков данных по сети? - PullRequest
5 голосов
/ 07 июля 2010

У меня есть серверное приложение, которое предлагает данные нескольким клиентам по сети.Вы можете представить данные в виде огромного списка строк.Данные на сервере могут изменяться, и их необходимо синхронизировать на всех клиентах.

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

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

Я считаю, что это очень распространенный сценарий, поэтому должен существовать шаблон, который решает проблему.Я использую C # 4 и WCF, но шаблон должен быть независимым от языка, я считаю.

Ответы [ 4 ]

2 голосов
/ 07 июля 2010

Посмотрели ли вы Microsoft Synchronization Framework для .Net. Это дает вам лучший контроль над тем, что синхронизируется и как. WCF полностью поддерживается. Он поддерживает добавочные обновления и синхронизирует изменения обратно на сервер.

API довольно большой и охватывает не только синхронизацию баз данных, но есть множество статей. Это должно помочь вам начать:

Введение в синхронизацию базы данных Sync Framework

Синхронизация баз данных

0 голосов
/ 07 июля 2010

Может быть, эта статья о Архитектурных шаблонах для синхронизации данных будет вам полезна.

Похоже, Шаблон проектирования для синхронизации данных на основе событий близокк тому, что вам нужно.

0 голосов
/ 07 июля 2010

Я бы просто добавил еще одно сообщение, которое отправляет полное обновление клиенту сразу после запроса на подписку.

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

0 голосов
/ 07 июля 2010

У меня нет опыта в этом, но ...

Если каждое «начальное соединение» содержит «метку времени», и когда вы подписываетесь, вы подписываетесь «начиная с метки времени первоначального соединения», тогда сервер может включатьвсе изменения, произошедшие с этой отметки времени, да?

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

, например, вместо

void Connect()
Subscribe()

у вас есть

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