2014-12-19 2 views
0

У меня есть несколько серверов (для загрузки), которые прослушивают все сообщения (MQTT) с помощью подстановочных знаков, однако мне нужно, чтобы каждое сообщение обрабатывалось только один раз одним из серверов. Как я могу это сделать?rabbitmq & MQTT - архитектура для кластера клиентов

Спасибо, ребята!

ответ

1

Это звучит как прецедент для «классической» очереди сообщений со многими потребителями. Обратите внимание, что подписчики с корневыми подписями - это огромный антипаттерн в MQTT, поскольку медленные клиенты-клиенты могут замедлить работу всей системы, если не выполняется сложная обработка противодавления.

Я видел, что люди делают что-то подобное, что вы хотите достичь с помощью следующей архитектуры:

  1. HiveMQ MQTT broker, который находится на краю MQTT. Этот брокер реализует собственный плагин (с системой плагинов с открытым исходным кодом), который пересылает каждое сообщение MQTT (с JMS, AMQP или HTTP) другому брокеру сообщений, например AWS SQS.
  2. Потребители просто используют сообщение в очереди сообщений.

Это очень хорошо работает в облачной среде, тем более что вам не нужно заботиться о масштабировании очереди сообщений, так как, например, SQS делает это автоматически для вас. Вы можете добавить больше серверов HiveMQ на край, а бэкенд MQ также масштабируется.

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

HiveMQ 3 (будет выпущен в первом квартале 2015 года) будет поддерживать желаемое поведение из коробки (распространять сообщения по теме среди подписчиков с семантикой только один раз), поэтому это отлично работает без какой-либо дополнительной системы. Однако вам придется ждать этого готового решения несколько месяцев.

Обязательная оговорка: Я участвую в разработке HiveMQ, так как всегда: этот ответ может быть предвзятым.

+0

Как вы обычно реализовать запасной вариант по электронной почте/... когда потребитель не потребляет тему, в чтобы предупредить его? Поддерживает ли HiveMQ это по умолчанию? – user3684457

+0

Вы имеете в виду, если потребитель не потребляет сообщение? Ну, в этом случае вы можете взглянуть на документацию системы плагинов (hivemq.com/docs/plugins/latest/), если требуемые перехватчики могут быть реализованы. Я не думаю, что для решения этой проблемы существует одноразовое решение. –

+0

В принципе, у меня будет 10 потребителей по определенной теме, и, возможно, 5 из них не будут потреблять последние сообщения - я хочу найти способ получить их идентификатор клиента в реальном времени, чтобы добавить некоторую логику, тогда – user3684457

0

Практически невозможно гарантировать, что каждое сообщение будет обработано ровно один раз в этом сценарии.

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

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

Даже эта мера не будет строго гарантировать ровно один раз только обработку - смотрите здесь для более подробной информации: http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2010-August/008272.html

Смежные вопросы