Лучшая технология для обмена сообщениями клиентов в реальном времени - PullRequest
1 голос
/ 14 января 2011

Я хочу улучшить ведение журнала в службе Windows. В настоящее время ведение журнала ведется в базе данных, но я хотел бы написать клиентов, которые каким-либо образом могут подключаться к службе и получать сообщения журнала в режиме реального времени. Служба всегда должна выводить сообщения журнала в свою конечную точку, и несколько клиентов могут подключаться и отключаться от нее по своему усмотрению. Когда они подключены, они будут получать сообщения по мере их отправки. Какую технологию лучше использовать для этого? Сервис написан на .Net 4.

EDIT: Подойдет ли здесь многоадресная рассылка tcp / ip? Я писал одноадресные вещи в прошлом, поэтому я не боюсь работать на этом уровне, но подходит ли он для этой работы?

Ответы [ 4 ]

2 голосов
/ 14 января 2011

Редактировать: добавлен материал до конца.

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

Для бита посередине Оплачивается: Tibco MQSeries (IBM) Microsoft MSMQ (входит в состав MS OS) Бесплатно Прокрутите свои собственные (на самом деле довольно легко даже для высокой пропускной способности), используя Remoting / WCF / ASP.Net / Web Service. Apache MQ и несколько других сред с открытым исходным кодом.Слишком много для перечисления. Для конечной точки, это скорее зависит от того, что находится посередине, но как только вы установили связь и запустили ее, это всего лишь случай обернуть ее и опубликовать сообщения, которые будут использованычто бы ни слушал / подписывался. Это все довольно весело.Если вы хотите подход.Сделайте это:

1) Определите пару интерфейсов C #, скажем ISubscribe, IPublish и IMessage.

2) Добавить методы / события.ISubscribe нуждается в новом событии сообщения и некотором способе подписаться на определенный тип сообщения.IPublish нужен способ отправки сообщений определенного типа.IMessage - это сообщение. 3) ... 4) прибыль. Хорошо, шаг 3 не очень понятен, но здесь вы делаетеРеализовать реализацию, используя то, что вы выбрали выше.Попробуйте Microsoft MSMQ, он встроен в Windows и легко доступен из c #.После того, как вы запустите это, вы можете подумать об альтернативах. Надеюсь, что это поможет. Ян

Редактировать: несколько слегка выделенных вариантов.

ЗдесьЕсть несколько вариантов.Все они имеют свои сильные и слабые стороны.

Поэтому я буду придерживаться IPublish, ISubscribe и IMessage.

На IPublish я добавлю один метод:

void SendMessage (сообщение IMessage);

На ISubscribe я добавлю один метод и одно событие

event EventHandler NewMessage;void Subscribe (string channel);

и IMessage будет иметь: string Channel {get;} string Body {get;}

Идея в том, что вы просто подписываетесь на канал, и мыВы используете строку для названия канала, потому что это легко.Сообщение содержит канал, для которого это сообщение, и строку для тела (опять же, потому что это легко, я здесь не разбираюсь в сериализации, давайте просто заставим сообщения двигаться).Поэтому, когда вы отправляете сообщение, предполагается, что кто-то подписывается на канал, которому вы отправили сообщение.

Итак, помня об этом, давайте поиграем с несколькими вариантами:

1) база данных.Опубликовать пишет сообщение в базу данных.Подписчики опрашивают таблицу на наличие новых строк, адресованных каналу, на который они подписаны.2) MSMQ Существует несколько способов использования MSMQ, но давайте просто скажем, что подписка создает канал для каждого клиента, а публикация помещает сообщение в каждую из очередей клиента.Затем подписчик решает действовать, если он адресован ему.(Посмотрите на CodeProject, как по-настоящему использовать MSMQ). 3) Реализация SMTP (да, электронная почта: D). Subscribe добавляет себя в группу Exchange, публикация отправляет электронную почту всем пользователям в группе.Хорошо, это немного глупый пример, но вы поняли идею.4) Согласованность.Coherence - это база данных в памяти, доступная от Oracle.Он поддерживает практически все, что вы хотите.Публикация записывает новое сообщение в кеш Coherence, подписчики подписываются на события, вызванные кешем.5) Служба Windows, в которой размещается веб-служба, предоставляемая WCF.Microsoft фактически предоставляет образец WCF, который делает простой чат-сервер / клиент.Это почти то, что вы хотите.

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

1 голос
/ 14 января 2011

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

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

1 голос
/ 14 января 2011

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

0 голосов
/ 20 января 2011

Хорошо, я дал многоадресную рассылку tcp / ip, и она, казалось, работала довольно хорошо, так как в реальном управлении не требовалось, все могло подключиться к потоку и прослушать его. Я был немного обеспокоен объемом трафика, хотя.

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

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

Пока все выглядит неплохо, просто нужно поработать над некоторыми аспектами.

...