Каков наилучший способ связи между службой WCF и отдельными потоками? - PullRequest
5 голосов
/ 16 декабря 2011

Формулировка вопроса не обязательно делает проблему справедливой ...

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

Так что это работает нормально, как и должно. Пользовательский интерфейс клиента может передавать данные на хост WCF. Но мой вопрос: как мне сделать эти данные полезными? У меня есть пара движков, работающих на хосте windows service / WCF, но хост WCF совершенно не знает о существовании каких-либо фоновых движков. Мне нужны запросы клиента на связь, чтобы иметь возможность взаимодействовать с этими движками .

Кто-нибудь имеет представление о хорошем шаблоне или методологии проектирования о том, как подходить к упрощению связи между хостом WCF и запущенными потоками?

1 Ответ

3 голосов
/ 16 декабря 2011

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

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

Например, если клиенту требуется сформированный отчет, мы запускаем запрос через WCF, и WCF создаетзапрос на генерацию отчета в базе данных.

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

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

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

Этот механизм позволяет нам выполнятьпара вещей:

1) Мы можем масштабировать количество служб, обрабатывающих эти запросы, на нескольких физических / виртуальных машинах по мере увеличения рабочей нагрузки.

2) Данная служба может поддерживать множество клиентов.

3) Через интерфейс WCF мы можем расширить эту поддержку на любую клиентскую платформу, которую мы выбираем для поддержки (web, win, tablet, phone и т. Д.).

Забыли упомянуть:

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

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

...