Обмен сообщениями без посредников C#

У меня есть несколько клиентов WPF в одной корпоративной сети. Я хочу, чтобы эти клиенты обменивались сообщениями друг с другом. Я не хочу запускать отдельный процесс на сервере, поэтому решение без брокера может показаться лучшим. Я рассматривал возможность использования PNRP, но для этого требуется, чтобы служба PNRP работала на каждом клиенте, и я не уверен, что смогу гарантировать, что все клиенты будут или могли бы выполнять это. Я также взглянул на ZeroMq, который выглядит идеально с точки зрения простоты и его очень легкого веса, однако мне нужно знать конечные точки для связи в стиле TCP/IP, и каждый клиент не будет знать о других, скорее, они каким-то образом ему нужны обнаружить друг друга. По сути, я хочу многоадресный стиль общения, но без использования многоадресной рассылки, так как для этого потребуется, чтобы я настроил диапазон адресов в корпоративной сети и задействовал инфраструктуру и т. Д.

Итак, я думаю, вопрос в том, есть ли варианты, которые я не рассмотрел, которые отвечают всем требованиям?

Заранее благодарю за любую помощь.

6 ответов

Шаблон pub-sub ZeroMQ прост и быстр, пока вы не достигнете сотен клиентов; тогда вы можете переключиться на настоящий протокол многоадресной рассылки (PGM) без изменения вашего приложения.

Возможно, вам следует проверить NServiceBus. Это настоящий сервисный автобус, так что посредников нет посредников. Он работает на MSMQ, так что ваши серверы Windows будут поддерживать это "из коробки". Он также поддерживает транзакционные сообщения. Он также поддерживает модель pub/sub, которая должна удовлетворять требованиям многоадресной рассылки.

Если вы не возражаете против использования коммерческого продукта: служба распространения данных OMG - это стандарт с несколькими реализациями, которые могут сделать то, что вы ищете. По крайней мере один из них поддерживает C# и не требует установки чего-либо на ваших компьютерах - только библиотеки. Раскрытие информации: я работаю в этой компании.

По сути, я хочу многоадресный стиль общения, но без использования многоадресной рассылки, так как для этого потребуется, чтобы я настроил диапазон адресов в корпоративной сети и задействовал инфраструктуру и т. Д.

DDS по умолчанию использует UDP/IP через многоадресную рассылку для обнаружения и обмена данными, но программно или через файлы конфигурации может быть задано указание использовать UDP только для одноадресной передачи или TCP. Это не влияет на логику приложения, поэтому концептуальная многоадресная природа сохраняется. Однако, если в вашем распоряжении нет многоадресной IP-рассылки, вы потеряете некоторые встроенные функции автоматического обнаружения. В этом случае вам необходимо заранее знать IP-адреса или имена хостов всех узлов, которые потенциально могут участвовать в обмене данными. Оттуда промежуточное программное обеспечение сможет выяснить, кто из них на самом деле присутствует, и соответствующим образом настроить свои коммуникации.

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

Мы написали одноранговую шину сообщений Zebus на основе ZeroMq (транспорт), Cassandra (одноранговое обнаружение и постоянство) и Protobuf (сериализация).

Это открытый исходный код и тестирование производства https://github.com/Abc-Arbitrage/Zebus

Зебус активно развивается и активно использует свое производство. В настоящее время существует только привязка к языку.NET, но, как отметил OP, у него есть только клиенты WCF, что должно удовлетворить его потребности.

Рассматривали ли вы одноранговый протокол для WCF? Смотрите здесь для получения более подробной информации: http://msdn.microsoft.com/en-us/library/cc297274.aspx

ZeroMQ - хороший выбор для этого. Чтобы решить проблему обнаружения, установите сервер, на котором каждый клиент регистрируется при запуске и остановке. На этом сервере также может работать ZeroMQ как в качестве издателя, так и в качестве подписчика.

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

Другие вопросы по тегам