.NET Лучший подход к реализации модели очередей клиент / сервер с внешним приложением? - PullRequest
3 голосов
/ 09 февраля 2009

Вот спецификация:

  1. Несколько клиентов, использующих приложение winforms WPF на своих локальных компьютерах
  2. Клиенты инициируют запросы к серверу на выполнение моделирования. Эта инициация, вероятно, должна осуществляться через веб-сервис, но приветствуются другие предложения
  3. Запросы ставятся в очередь на сервере
  4. Сервер отправляет последовательные запросы к имитационной модели через веб-сервис.
  5. Сервер сообщает клиенту, что моделирование завершено

Дополнительным требованием является отмена клиентом ранее сделанного им запроса. Обратите внимание, что нам не нужно беспокоиться об отправке слишком большого объема данных по конвейеру, мы только посылаем подтверждение того, что определенный прогон симуляции завершен (или не выполнен)

Для начала я подумал, что мог бы сделать все это с помощью одного веб-сервиса asmx, но теперь я думаю, что это может быть громоздким. WCF кажется другим вариантом, но я не знаком с ним, и он кажется гораздо более сложным, чем нужная мне функциональность.

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 09 февраля 2009

Клиент: Чтобы получить уведомление о завершении, вам потребуется использовать шаблон асинхронного проектирования при вызове веб-службы с клиента. Если вы используете «добавить веб-ссылку» для создания клиентского прокси, то для вас будут сгенерированы асинхронные шаблоны. См. " Асинхронный доступ к веб-службам в шаблонах проектирования .NET ".

Сервер: Ванильный веб-сервис .Net 2.0 asmx может ставить в очередь входящие вызовы для последовательной обработки на сервере. Вы можете создать простой диспетчер, используя класс BackgroundWorker. Диспетчер принимает каждый входящий запрос и назначает его фоновому потоку. Чтобы сериализовать потоки, нужно, чтобы рабочий метод поместил lock вокруг вызова симуляции. См. этот пример использования потоков BackgroundWorker.

Отмена : Чтобы обработать отмену, сервер должен вернуть уникальный идентификатор со своим ответом на запрос клиента, а также вставить идентификатор и связанную справочную ссылку рабочего в словарь. Метод CancelSimulation веб-службы принимает идентификатор, ищет ссылку BackgroundWorker в словаре и вызывает его метод CancelAsync. Удалите словарную запись, когда задача завершится или будет отменена. Словарь должен быть общим для всех вызовов веб-сервисов, поэтому он должен быть статическим / общим. К счастью, статический словарь является поточно-ориентированным.

1 голос
/ 09 февраля 2009

Вы должны посмотреть на WCF. Использование веб-службы + опрос может убить ваш сервер (если у вас не так много клиентов) - просто посмотрите на Twitter. WCF имеет постоянное соединение, которое должно идеально вам подойти.

Что касается очередей, добавьте System.Messaging в качестве ссылки и используйте MSMQ. Я не могу вспомнить, есть ли транспорт MSMQ для WCF, но я уверен, что вы можете найти его. Использование этого убило бы двух зайцев одним выстрелом. Если вы хотите использовать MSMQ, ваш сервер должен быть в домене Windows.

В противном случае, я настоятельно рекомендую вам записывать события в БД и выбирать их оттуда по окончании рабочего потока. Хранение их в очереди в памяти не очень отказоустойчиво.

1 голос
/ 09 февраля 2009

WCF кажется другим вариант, но я не знаком с ним и это кажется гораздо сложнее, чем необходимая мне функциональность.

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

Поскольку вы прямо говорите, что клиент будет отправлять запросы в очередь на сервере - почему бы просто не использовать систему обмена сообщениями на основе очередей, например MSMQ?

Имея WCF на сервере и клиенте, вы можете быстро переключаться между использованием MSMQ и использованием «обычного» вызова HTTP SOAP по сравнению с использованием, например, вызов REST - все в конфиге. Этот тип гибкости стоит потратить немного времени на его изучение, ИМХО.

0 голосов
/ 09 февраля 2009

Тебе стоит присмотреться к WCF. Я написал специальную библиотеку для работы, которая позаботится о некоторых странных настройках, но вы можете написать отличный веб-сервис в несколько десятков строк кода с помощью WCF. Это очень расширяемый. Единственная проблема заключается в том, что требуется некоторое время, чтобы «получить» его, но как только вы сделаете это действительно, очень просто. Удачи.

...