PubSub + Надежная доставка сообщений ненадежно присутствующим абонентам
Мне нужно создать систему, которая использует шину публикации / подписки (например, Mule, ZeroMQ, RabbitMQ), но из литературы все подразумевает, что приложения-подписчики надежно доступны для получения сообщений из тем, на которые они подписываются, как только шина Pub/Sub может доставить сообщение.
У меня есть система, в которой некоторые приложения будут надежно подключены к шине публикации / подписки, но другие приложения не будут активны или подключены к шине все время.
Очевидное решение состоит в том, чтобы иметь своего рода протокол "присутствия" между ненадежным приложением и шиной публикации / подписки, чтобы "настоящие" приложения доставляли свои сообщения немедленно, а "не присутствующие" приложения помещали свои сообщения в очередь в постоянном буфере. некоторого рода, и как только они завершают "рукопожатие присутствия", сообщения в очереди доставляются в новое приложение.
Существуют ли какие-либо шины публикации / подписки, в которые встроена подобная функция, или есть надстройки с открытым исходным кодом, которые делают это? Можете ли вы указать мне какие-либо URL, которые описывают это?
2 ответа
Вы можете легко добиться такого поведения с любым AMQP-совместимым брокером (например, RabbitMQ).
Выберите правильный тип обмена для вашей модели использования. Вы хотите использовать direct
Обмен, если вы всегда отправляете в абсолютно названные направления, что-то вроде chat.messages
,
Если вы хотите сделать маршрутизацию на основе шаблонов, вы захотите использовать topic
обмен. Затем вы можете направить на основе шаблонов, таких как chat.messages.*
,
Маршрутизация описана более подробно в Учебниках RabbitMQ.
Чтобы создать тип постоянной подписки, о которой вы упомянули, попросите каждого подписчика создать очередь, которая является частной для этого подписчика. Затем очередь связывается с соответствующими ключами маршрутизации на выбранном вами обмене.
Поскольку у каждого подписчика есть своя собственная очередь, сообщения будут потребляться подписчиком, когда он активен, и сохраняться, когда абонент неактивен или отключен.
Вы не упомянули предпочитаемый язык, но в Java вы можете сделать это с помощью JMS, используя надежных подписчиков. Любая реализация JMS ( их много, включая вышеупомянутый RabbitMQ) будет поддерживать эту функцию.