PubSub + Надежная доставка сообщений ненадежно присутствующим абонентам

Мне нужно создать систему, которая использует шину публикации / подписки (например, Mule, ZeroMQ, RabbitMQ), но из литературы все подразумевает, что приложения-подписчики надежно доступны для получения сообщений из тем, на которые они подписываются, как только шина Pub/Sub может доставить сообщение.

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

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

Существуют ли какие-либо шины публикации / подписки, в которые встроена подобная функция, или есть надстройки с открытым исходным кодом, которые делают это? Можете ли вы указать мне какие-либо URL, которые описывают это?

2 ответа

Вы можете легко добиться такого поведения с любым AMQP-совместимым брокером (например, RabbitMQ).

Выберите правильный тип обмена для вашей модели использования. Вы хотите использовать direct Обмен, если вы всегда отправляете в абсолютно названные направления, что-то вроде chat.messages,

Если вы хотите сделать маршрутизацию на основе шаблонов, вы захотите использовать topic обмен. Затем вы можете направить на основе шаблонов, таких как chat.messages.*,

Маршрутизация описана более подробно в Учебниках RabbitMQ.

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

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

Вы не упомянули предпочитаемый язык, но в Java вы можете сделать это с помощью JMS, используя надежных подписчиков. Любая реализация JMS ( их много, включая вышеупомянутый RabbitMQ) будет поддерживать эту функцию.

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