Как лучше всего отправить мероприятие на все рабочие станции? - PullRequest
5 голосов
/ 18 декабря 2008

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

Проблема началась, когда я обнаружил, что маршрутизаторы не пересылают широковещательные пакеты UDP x.x.x.255. Позже я сделал простой тестовый хук в VB6 для перехвата сетевых сообщений, но даже те, которые не прошли маршрутизаторы. Я также написал простой анализатор пакетов, чтобы отфильтровать пакеты только для того, чтобы обнаружить, что сетевые пакеты никогда не достигают назначенного пункта назначения.

Затем я посмотрел и изучил использование MSMQ по HTTP, но для этого требовалось установить IIS на целевой рабочей станции. Поскольку рабочих станций так много, это будет серьезной проблемой безопасности.

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

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

Я использую Visual C # 2005. Пожалуйста, помогите мне выйти из этого затруднительного положения.

Спасибо

Ответы [ 5 ]

3 голосов
/ 18 декабря 2008

Это именно то, для чего Multicast был разработан.

Обычное сетевое вещание (по определению) остается в локальной подсети и не будет пересылаться через маршрутизаторы.

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

3 голосов
/ 18 декабря 2008

Рассмотрите возможность использования механизма обратных вызовов WCF и событий. Есть хорошее введение Ювала Лоуи.

Другой способ - реализовать блокировку вызовов веб-службы . Так работает, например, чат GMail. Тем не менее, вам придется иметь дело с сессиями и таймаутами здесь. Он работает, когда клиенты находятся за NAT и межсетевыми экранами и недоступны напрямую. Но это может быть слишком сложно для простого оповещения внутри сети.

0 голосов
/ 18 декабря 2008

Я думаю, что некоторые из вас значительно думают об этом. В каждую версию Windows уже встроен сервис, обеспечивающий именно эту функциональность! Это называется службой сообщений. Все, что вам нужно сделать, это убедиться, что эта служба включена и работает на всех клиентах.

(Хотя вы не указали в вопросе, я предполагаю, что из вашего выбора технологии все клиенты этой сети - Windows).

Вы можете отправлять сообщения с помощью этого средства из командной строки, используя что-то вроде этого:

NET SEND computername "This is a test message"

Команда NET SEND также имеет параметры для отправки по домену Windows или конкретным пользователям по имени независимо от того, где они вошли, или в каждую систему, подключенную к определенному серверу Windows. Эти параметры позволят вам легко избежать проблемы с подсетью, особенно если вы используете безопасность сети в вашей сети. (Вам может потребоваться, чтобы служба «Оповещение» была включена на определенных серверах, если вы отправляете сообщения через сервер, а не напрямую клиентам).

Программная версия этого API - NetMessageBufferSend () , которая довольно проста. При быстром сканировании P / Invoke.net будет найдена страница для этого API , которая предоставляет не только определения, которые необходимо вызвать в API, но и пример программы на C #!

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

ETA: я только что заметил, что служба Messenger и этот API полностью исчезли в Windows Vista. Очень странно, что Microsoft полностью удалила такую ​​функциональность. Похоже, что этот поставщик имеет совместимую замену для Vista.

0 голосов
/ 18 декабря 2008

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

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

0 голосов
/ 18 декабря 2008

Я думаю, эту проблему лучше всего решить с помощью сокета.

Откройте соединение с сервером и оставьте его открытым.

...