Надежная сетевая общедоступная связь: шина сообщений или публикация / подписка или многоадресная передача /PGM?

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

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

Я посмотрел вокруг и ZeroMQ (поддерживает Bus, Pub/Sub и PGM), а также Nanomsg (поддерживает Bus и Pub/Sub, но не PGM) выглядят как отличные библиотеки, подходящие для этой проблемы.

Какой сетевой метод лучше всего подходит в этом случае: шина сообщений, публикация / подписка или многоадресная передача /PGM?

1 ответ

Решение

Pub / Sub реализован как многоадресный, использование PGM в качестве метода транспорта прозрачно для клиента ZeroMQ. ZeroMQ усердно работает, чтобы скрыть детали реализации от клиента, что является одной из причин, почему он так хорошо работает. Но не позволяйте простоте обмануть вас, ZeroMQ - это профессионально разработанное решение для обмена сообщениями, очень мощное и гибкое. Это быстрый, эффективный и легко обрабатывать огромное количество сообщений.

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

В ZeroMQ публикация / подписка осуществляется по темам, определяемым пользователем, которые определяют, какие данные отправляются каким подключенным клиентам. Таким образом, если к моему сокету публикации подключено 10 клиентов, и 9 подписываются на тему "A", а 1 клиент подписывается на тему "B", и я отправляю сообщение с темой "B", то только Клиенту, подписанному на тему "Б", будет отправлено сообщение. ZeroMQ выполняет фильтрацию сообщений pub/sub как в точке передачи (во избежание потери пропускной способности), так и в точке приема (во избежание возможных состояний гонки, когда тема не подписана). Также можно подписаться на более чем одну тему.

Для реализации описанной вами системы обмена сообщениями я рекомендую создать два сокета на каждом узле кластера, один для получения сообщений от всех других узлов и один для отправки сообщений всем остальным узлам. Если вам не нужны темы, то подписка на тему "*" позволит этому клиенту получать все сообщения.

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