Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Клиент-серверное приложение. Методы оповещения клиентов?

489
02 декабря 2009 года
NeO_u
277 / / 11.10.2006
Добрый день. Пишу клиент-серверное приложение. Используя WCF. Задачи, в целом, стояло передо мной 2. 1) Разобраться с клиент-серверными приложениями. 2) Разобраться с WCF.
И так, опишу ситуацию:
Есть сервер, который производит операции с БД. Т.е. он отвечает за добавление/удаление и выборку нужной информации.
Есть ряд клиентов, которые работают с этой информацией.
У меня возникла проблема, как оповестить клиента о том, что было сделано какое-либо изменение?
Изначально я реализовывал данную возможность при помощи событий, но при 5-10 клиентов нагрузка на сервер была значительной и от этой идеи пришлось отказаться.

Я что-то слышал о методе пинга для клиент-серверных приложений. Насколько я понял, это когда клиент периодически посылает запрос на сервер на предмет изменений. Так вот, отсюда ряд проблем:
1) Как хранить добавленные/измененные/удаленные записи?
2) Как понять, что все клиенты уже получили данную запись...

ЗЫ: Изначально думал сделать так:
Каждая информация хранит в себе дату последнего изменения. У каждого клиента хранится эта дата последнего изменения (локальная статическая переменная). Клиент посылает запрос к серверу с этой датой и получает добавленную/удаленную или отредактированную информацию. Запрос этот идет раз 2-3 минуты. Но отсюда опять же возникает нюанс, либо мы всегда информацию проверяем таким образом, даже для локального обновления, т.е. клиент изменил запись, нажал сохранить, и она у него обновится только через эти 2-3 минуты, а не сразу, либо мы рискуем потерять часть записей. Т.к. при изменений даты последнего изменения, у клиента, мы рискуем потерять записи которые были изменены до этой даты.

ЗЫЫ: Хотелось бы услышать советы как можно сделать так, что бы изменения для клиента, который делает эти изменения, вносились моментально, а для остальных клиентов через эти 2-3 минуты, и так, что бы не нарушилась целостность информации.

Можно даже ссылки на документаху, у кого есть :-D
11
02 декабря 2009 года
oxotnik333
2.9K / / 03.08.2007
имхо наиболее рациональная модель отслеживания изменений, когда конкретный клиент сам запрашивает данные которые ему нужны, либо по команде пользователя, либо через определенный интервал времени (1-2 мин.)
Либо посылать некое уведомление всем клиентам об изменении данных (но не конкретизируя что именно изменилось) а клиент уже будет решать, обновляться или нет, и если обновляться, то какие именно данные тягать с сервера.
489
02 декабря 2009 года
NeO_u
277 / / 11.10.2006
Цитата: oxotnik333
имхо наиболее рациональная модель отслеживания изменений, когда конкретный клиент сам запрашивает данные которые ему нужны, либо по команде пользователя, либо через определенный интервал времени (1-2 мин.)
Либо посылать некое уведомление всем клиентам об изменении данных (но не конкретизируя что именно изменилось) а клиент уже будет решать, обновляться или нет, и если обновляться, то какие именно данные тягать с сервера.



Хм...Вы читали, то что написано или нет?

5
02 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: NeO_u
Хм...Вы читали, то что написано или нет?


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

14
02 декабря 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: NeO_u
Хм...Вы читали, то что написано или нет?


А вы? У вас обычная проблема синхронизации и недостаточно данных для всеобъемлющего охвата поставленной задачи. Нет, например, ответа на вопрос - зачем? С какой целью? Посмотрите как работают любые многопользовательские БД-ориентированные приложения (чет на ум счас приходит только 1С..)

489
02 декабря 2009 года
NeO_u
277 / / 11.10.2006
to hardcase:
Счетчик - это хорошо. Получается, что если счетчик изменился, то мне необходимо подгружать все данные на сторону клиента/сервера, что бы их потом сравнивать - это дополнительная нагрузка на сеть, скажем так, лишняя пересылка информации.


to Phodopus:
А какой информации вам не достаточно?
Есть ряд клиентов, есть сервер.
Свящь один ко многим.
Надо, что бы все клиенты имели актуальную информацию. Если один из клиентов ее изменил, об этом должны узнать все остальные клиенты. Какой вам информации не достаточно?
Зачем? - Актуальность информации.
С какой целью? - цель, простая, надо, что бы каждый клиент имел актуальную информацию.

ЗЫ: Уточню, информация - это некий набор данных, который состоит из Текст + картинки, объем может достигать 2-3 метров (одной ячейки информации). Общий размер БД достигает 500 метров.
11
02 декабря 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: NeO_u

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

ЗЫ: Уточню, информация - это некий набор данных, который состоит из Текст + картинки, объем может достигать 2-3 метров (одной ячейки информации). Общий размер БД достигает 500 метров.


а что в моем сообщении напрягает?

5
02 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: NeO_u
to hardcase:
Счетчик - это хорошо. Получается, что если счетчик изменился, то мне необходимо подгружать все данные на сторону клиента/сервера, что бы их потом сравнивать - это дополнительная нагрузка на сеть, скажем так, лишняя пересылка информации.

Со счетчиком может быть связан журнал изменений, на основании которого клиент будет подгружать данные (каждое значение счетчика - некоторое изменение, похоже на SVN). Кроме того, нет никакой необходимости сразу прогружать полностью на клиента многие мегабайты данных, достаточно первоначально передавать ему их хэши ("контрольные суммы"), клиент по этим дайджестам сможет загрузить действительно изменившийся контент.

489
02 декабря 2009 года
NeO_u
277 / / 11.10.2006
Цитата: hardcase
Со счетчиком может быть связан журнал изменений, на основании которого клиент будет подгружать данные (каждое значение счетчика - некоторое изменение, похоже на SVN). Кроме того, нет никакой необходимости сразу прогружать полностью на клиента многие мегабайты данных, достаточно первоначально передавать ему их хэши ("контрольные суммы"), клиент по этим дайджестам сможет загрузить действительно изменившийся контент.



Да. Спасибо. Идея хорошая. как-то я об этом не подумал :)
Сегодня попробую сделать с журналом изменений. Завтра/Послезавтра напишу результаты, какой из методов подошел или не подошел и почему :-D

14
02 декабря 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: NeO_u
информация - это некий набор данных, который состоит из Текст + картинки, объем может достигать 2-3 метров (одной ячейки информации). Общий размер БД достигает 500 метров.


Когда информацию изменяет один человек - проблемы вообще не видно, она возникает только когда ее изменяют несколько человек (в svn это тот же конфликт). Вообще посмотрите как работают подобные системы, посмотрите - полезно. SVN, 1С, словом все где присутствует многопользовательская синхронизация.

1
02 декабря 2009 года
kot_
7.3K / / 20.01.2000
Кстати эта 1С и использует механизм счетчика для того что бы определить необходимость изменения.
14
02 декабря 2009 года
Phodopus
3.3K / / 19.06.2008
И Active Directory при репликации счетчиком пользуется, и механизмы многопользовательского доступа в некоторых СУБД по тому же принципу работают. Но в зависимости от задачи можно и другие алгоритмы найти. Самый затык - когда новых данных 2 и более копии.
5
02 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Phodopus
Самый затык - когда новых данных 2 и более копии.


В данном конкретном случае, думаю, топикстартер может ограничится принципом "кто успел того и тапки" (оптимистичная политика транзакции): фиксируется первое отправленное изменение, остальные клиенты получают ошибку сохранения (SVN в этом случае предлагает сказать update а потом merge).

489
05 декабря 2009 года
NeO_u
277 / / 11.10.2006
И так...что же получилось :)
А получилось следующее:
После долгого обдумывания алгоритма и чтения разныйх факов и доков, было выяснено, что WCF поддерживает колбэк функции и было принято решение именно ими и пользоваться. При подключении к серверу программа-клиент себя регистрирует, и с переодичностью 5-10 минут проверяет соединение. Если было произведено какое-то изменение, то вызывается функция для каждого клиента. Если соединение пропало, то программа-клиент его восстанвливает. Вот так все оказалось просто :)
11
25 января 2010 года
oxotnik333
2.9K / / 03.08.2007
Цитата: LostAkaLexx
с иностранными языками рамс да и со своим тоже


и не только с языками но и с логикой... как относится это сообщение к теме топика?

14
25 января 2010 года
Phodopus
3.3K / / 19.06.2008
относится потому что это бот которых некоторые модераторы не спешать удалять :)
262
25 января 2010 года
Iktomy
1.2K / / 11.10.2004
Цитата: NeO_u
Есть сервер, который производит операции с БД. Т.е. он отвечает за добавление/удаление и выборку нужной информации.



Вот именно в этом, как мне кажется, и есть вся загвоздка. Лучше эти процессы осуществлять не сторонним приложением, а средствами самой СУБД.

В таком случае ваша реализация с событиями будет вполне уместной.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог