клиент-серверная синхронизация

олег щербинин
Дата: 23.12.2009 10:34:01
Здравствуйте уважаемые форумцы.

есть удаленные клиенты (winform), сервер приложений (служба) и база данных ms sql server 2005

вопрос : как можно синхронизировать данные отправляемые на клиентов с данными БД
(в случае когда данные клиентов становятся не актуальными)

Чтение MSDN не дает желаемого результата.. посоветуйте пожалуйста!
D129
Дата: 23.12.2009 10:51:00
олег щербинин
Здравствуйте уважаемые форумцы.

есть удаленные клиенты (winform), сервер приложений (служба) и база данных ms sql server 2005

вопрос : как можно синхронизировать данные отправляемые на клиентов с данными БД
(в случае когда данные клиентов становятся не актуальными)

Чтение MSDN не дает желаемого результата.. посоветуйте пожалуйста!


Первый вариант - решение "в лоб".
Клиент переодически запрашивает все данные с сервера по таймеру. Недостаток очевиден - не будет работать хорошо если клиентов больше 3 ( а данных много).

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

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

Четвертый - комбинация третьего и второго.
То есть, клиент обратившись к серверу еще и узнает, что изменилось в таблице, на которую он "подписался".
andrei.t
Дата: 23.12.2009 10:57:59
олег щербинин
Здравствуйте уважаемые форумцы.

есть удаленные клиенты (winform), сервер приложений (служба) и база данных ms sql server 2005

вопрос : как можно синхронизировать данные отправляемые на клиентов с данными БД
(в случае когда данные клиентов становятся не актуальными)

Чтение MSDN не дает желаемого результата.. посоветуйте пожалуйста!


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

В любом случае, вариантов несколько:

- http://msdn.microsoft.com/en-us/sync/default.aspx (sync framework). Не знаю как он себя ведет с данными, которые надо несколько раз в секунду обновлять и синхронизировать между клиентами, но вещь интересная.

- свой/готовый механизм publish-subscribe (поверх любого MoM) или чего-нибудь своего. При старте клиенты регистрирует свои конечные точки, куда обновления пойдут. Служба по этим точкам делает рассылку.

http://remark.wordpress.com/articles/publish-subscribe-with-activemq-and-nms/
http://www.codeproject.com/KB/IP/PubSubUsingWCF.aspx

Мы, к примеру, свой бинарный протокол поверх голого TCP/IP используем, реализующий Pub/Sub, но нам сотни раз в секунду надо данные обновлять по некоторым записям, а таких записей очень много, так что без велосипеда, который имея код проще саппортить и допиливать, не обошлось :)
МСУ в отставке
Дата: 23.12.2009 10:59:43
Простите, но Вы дали неполную картину:

1
есть удаленные клиенты (winform), сервер приложений (служба) и база данных ms sql server 2005


2
вопрос : как можно синхронизировать данные отправляемые на клиентов с данными БД
(в случае когда данные клиентов становятся не актуальными)


Вопрос: в каком виде и где клиенты хранят эти данные?

P.S. Если это некий кеш, то его и обновляйте периодически.
gds
Дата: 23.12.2009 11:02:47
олег щербинин,

Самым оптимальным будет на сервере приложений создать событие, которое вызывается при изменении данных в БД. После регистрации каждого клиента подписывать на это событие. После внесение изменений в БД дергать событие и все кто подписался будут узнавать об изменениях. В обработчике собитий можно также передовать измененные данные. тем самым информировать клиента только об измененных данных. Ну или дергать данные из БД и делать merge. с данными на клиенте.
олег щербинин
Дата: 23.12.2009 11:08:07
D129,
спасибо за вашь коментарий.
интересны способы реализации последнего варианта.
механизмов для реализации его я думаю много.. репликация и специальные классы ( механизмы SQL SERVERA) и наверное много еще чего..
но как все это использовать. где найти примеры.. (тону в теории)
олег щербинин
Дата: 23.12.2009 11:13:32
andrei.t,

обновления в реальном времени

автор

свой/готовый механизм publish-subscribe (поверх любого MoM) или чего-нибудь своего. При старте клиенты регистрирует свои конечные точки, куда обновления пойдут. Служба по этим точкам делает рассылку
автор


простите что за служба ?
олег щербинин
Дата: 23.12.2009 11:16:03
МСУ в отставке,
хранят в виде объектов в памяти (можно сказать это кеш?)
думаю что нужно обновлять не периодически а событийно.
andrei.t
Дата: 23.12.2009 11:18:04
олег щербинин,

Вы писали, что у Вас в архитектуре есть "сервер приложений (служба)"

олег щербинин
есть удаленные клиенты (winform), сервер приложений (служба) и база данных ms sql server 2005


Судя по предыдущему ответу посмотрите всё-таки на sync framework

http://msdn.microsoft.com/en-us/sync/bb821992.aspx (здесь небольшое введние). Версионность, обнаружение и разрешение конфликтов, отсылка только изменившихся данных, протокол и фреймворк для построения приложений он уже предоставляет из коробки. К тому же интеграция с продуктами MS должна быть неплохой раз у вас SQL 2005.
D129
Дата: 23.12.2009 11:43:00
andrei.t

Судя по предыдущему ответу посмотрите всё-таки на sync framework

+1
и сам посмотрю - на будущее.