Каков наилучший способ асинхронного взаимодействия распределенных процессов?
Вопрос
Я разрабатываю приложение, в котором распределенные компоненты взаимодействуют друг с другом по сети асинхронным способом типа pub / sub.
Для этого мне нравится идея отправки XML через сокеты - это асинхронно, мне не нужен какой-либо сервер, и он может работать локально или по сети.Мне пришлось бы задействовать свой собственный механизм pub / sub, что, вероятно, не будет слишком обременительным - я мог бы использовать IP-адрес в качестве идентификатора подписчика.Языком реализации будет C++.Я уже использовал этот метод раньше с хорошими результатами.Но, интересно, есть ли способ получше?Любой совет приветствуется.
Редактировать:Я еще не принял решения, но меня интересует комментарий cparkode к protobuf:
"Я никогда не понимал популярности использования XML для сетевого общения.В любом случае, я понимаю, что протокол - это только часть вашей проблемы, но по этому вопросу тоже есть Google protobuf: http://code.google.com/p/protobuf/ – caparcode (11 марта в 1:01)"
Решение
Вместо использования XML, возможно, было бы лучше использовать существующую платформу передачи сообщений.Взгляните на libt2n или d-шина
Но если в прошлом вы использовали свою собственную реализацию сокета с хорошими результатами, я не вижу причин, по которым вам следует меняться.Если он не сломался, не чините его :)
Другие советы
Вместо просто прямых розеток вы могли бы рассмотрим такое решение, как AMQP.
Когда вы говорите об использовании сокет-соединений для интерфейса pub / sub, это обычно означает двухточечную связь, которая не всегда является масштабируемым решением.AMQP действительно решает проблему такого рода с пабом / субподрядчиком.Это бесплатно, с открытым исходным кодом, и это работает.
Учитывая, что они уже решили проблему с пабом / подразделением, вы, возможно, захотите воспользоваться их работой, вместо того чтобы делать это самостоятельно.
Я рекомендую OpenAMQ.
Тем не менее, это действительно зависит от того, в какой среде вы работаете.AMQP требует, чтобы брокер AMQP (приложение, отвечающее за маршрутизацию сообщений) был запущен где-то в системе.
RabbitMQ также является брокером AMQP, который поддерживает другие протоколы, такие как XMPP, HTTP, STOMP, SMTP, а также использует адаптеры.
Особенно, если вы делали это раньше, и это все еще соответствует вашим потребностям, придерживайтесь этого.
Как насчет встраивания веб-сервера в ваше приложение? EasyHTTPD имеет открытый исходный код на C ++ и довольно прост в использовании.Асинхронная часть достаточно проста.Вы либо создаете новый поток для отправителя, либо для получателя.
Если вы ищете XML и кроссплатформенность для загрузки, вы можете рассмотреть механизм XML-RPC, такой как SOAP (я использовал gSOAP для связи между сервером C в linux и клиентом C ++ в win32, и он отлично работал, как только вы во всем разобрались).
Если вы не слишком склонны к XML и вам нужно что-то простое и эффективное, тогда рассмотрите ЯМИ библиотека.Он довольно прост в использовании, и данная ссылка содержит достаточно документации, обоснования и примеров, чтобы начать работу.