Интенсивно распределенная архитектура C # (WCF) - PullRequest
2 голосов
/ 30 июня 2010

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

Сценарий

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

Предпосылки

Серверная часть реализации будет размещена в службе Windows. На стороне клиента будет приложение Windows Forms. На стороне сервера будет много обработки памяти. Сервер будет выплевывать эти данные нескольким тонким клиентам (20-ти). Большую часть времени сервер будет передавать данные клиентам, но иногда клиенты будут сохранять данные обратно на сервер. Скорость передачи данных очень важна, однако я хорошо знаю, что WCF может справиться с быстрым распространением данных. Шифрование / безопасность не так важны, так как приложение будет работать в защищенной локальной сети.

Запросы

С учетом приведенной выше информации:

1) Какой шаблон дизайна мне лучше всего подходит? - Учитывая все вышесказанное, я хочу, чтобы сервер непрерывно передавал вновь рассчитанную информацию немедленно клиентам, в отличие от текущей реализации, которая предусматривает непрерывное извлечение клиента из сервера. 2) Какой тип привязки WCF следует использовать для обеспечения максимальной скорости передачи данных? (как можно ближе к реальному времени, это то, что я после) 3) Должен ли я использовать библиотеку классов для совместного использования общих объектов между клиентскими и серверными приложениями? 4) Как лучше всего связать мои объекты на стороне клиента, чтобы непрерывно видеть живые обновления при изменении данных?

Если я что-то забыл, не стесняйтесь указывать на это

Помощь с благодарностью.

Ответы [ 2 ]

6 голосов
/ 30 июня 2010

1) Какой шаблон проектирования мне лучше всего подходит?

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

Я бы порекомендовал использовать для этого платформу Juval Lowy's Publish-Subscribe Framework.

Платформа публикации-подписки http://i.msdn.microsoft.com/cc163537.fig07(en-us).gif.

Эта структура подробно описана в этой статье MSDN .И вы можете бесплатно загрузить исходный код фреймворка на веб-сайте Лоуи, IDesign.net .

По сути, логика сервера, выполняющая вычисления внутри службы Windows,Клиент публикации в графике и различные приложения WinForm являются Клиентами подписки.Служба Pub / Sub Service находится в вашей службе Windows.Он управляет списком подписавшихся клиентов и предоставляет единую конечную точку для вашего сервера для публикации результатов расчетов.Таким образом, ваш сервер выполняет вычисления и публикует результат один раз в конечной точке Pub / Sub Service.Служба Pub / Sub отвечает за публикацию результатов подписанным клиентам.

2) Какой тип привязки WCF следует использовать для обеспечения максимальной скорости передачи данных?

Если бы все ваши сообщения WCF были на одном компьютере, вы бы хотели использовать NetNamedPipeBinding .Однако, поскольку вы будете распределены, вы хотите использовать NetTcpBinding .

Для решений по связыванию WCF я нашел эту диаграмму полезной.

WCF Binding Selection Flow Chart

3) Должен ли я использовать библиотеку классов для совместного использования общих объектов между клиентскими и серверными приложениями?

Поскольку вы контролируете обана стороне клиента и сервера я бы настоятельно рекомендовал использовать библиотеку классов вместо использования функции «Добавить ссылку на службу» в Visual Studio.Подробное обсуждение этого вопроса см. В этом SO-вопросе-ответе .

4) Как лучше всего связать мои объекты с данными нана стороне клиента, чтобы постоянно видеть живые обновления при изменении данных?

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

0 голосов
/ 30 июня 2010

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

Вообще говоря, ваша бизнес-логика размещена в службе Windows, в которой тип является Субъектом (наблюдаемым). Вы можете опубликовать конечную точку для клиентов, чтобы зарегистрироваться для уведомлений. Это будет служба WCF с потенциально двумя операциями:

  1. RegisterClient (...)
  2. UnregisterClient (...)

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

Конечная точка клиента обычно может быть

  1. Notify (Результат ...);

А ваш сервер просто вызывает это, когда у него есть новые данные ...

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

Это отнюдь не то, что вам следует делать, но, возможно, это направление, с которого нужно начинать?

...