Высокая доступность для сервисов C ++ на основе MQTT

Я написал несколько сервисов на C ++ с клиентом MQTT. На основе сообщения, полученного в теме MQTT, служба c ++ выполнит некоторые действия, такие как отправка сообщения MQTT в другую тему или сохранение сообщения в базе данных и т. Д.

Я установил несколько брокеров MQTT на докерах и подключил эти брокеры MQTT к балансировщику нагрузки высокой доступности. Все эти брокеры MQTT также объединились в кластеры.

Итак, если к клиенту 1 подключен брокер-1 (через балансировщик нагрузки), он может отправить сообщение клиенту x, подключенному брокеру -x. Из-за кластеризации брокеров MQTT.

Итак, как я могу установить балансировщик нагрузки для моих служб c ++ с HA или аналогичными балансировщиками нагрузки?

Обновлять:

В случае API HTTP / REST запрос будет передан только одному веб-приложению в любой момент времени. Но в случае MQTT сообщение будет опубликовано, и если я запустил несколько служб C ++ для Same ABC, то все службы обработают это сообщение. Как мне сделать так, чтобы сообщение обрабатывала только одна служба. Я хочу установить высокую доступность для службы C ++


person Kishore Chilakala    schedule 13.12.2019    source источник
comment
Непонятно о чем ты. Вы уже настроили прокси-сервер высокой доступности для пересылки TCP-соединений своим MQTT-брокерам, и вы сгруппировали своих брокеров, поэтому каждая служба будет подключаться к вашему прокси-серверу высокой доступности и обрабатывать его как одного брокера. Вы имеете в виду, что теперь вы хотите превратить одну службу C ++ в кластер и чтобы каждое сообщение MQTT обрабатывалось только одним узлом в этом кластере? Это может быть что-то настроенное в вашем брокере MQTT.   -  person Philip Couling    schedule 13.12.2019
comment
В случае HTTP / REST API запрос будет передан только одному веб-приложению в любой момент времени. Но в случае MQTT сообщение будет опубликовано, и если я запустил несколько служб C ++ для Same ABC, то все службы будут обрабатывать это сообщение. Как мне сделать так, чтобы сообщение обрабатывала только одна служба. Я хочу установить высокую доступность для служб C ++.   -  person Kishore Chilakala    schedule 13.12.2019


Ответы (1)


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

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


Это может измениться с выходом MQTT 5.0. Есть еще много клиентов и брокеров, которые не поддерживают это. Однако, если и ваш клиент, и брокер поддерживают MQTT версии 5, тогда существует новая 1 концепция «общих подписок. ":

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

Вы не указали свою клиентскую библиотеку. Но ваши первые шаги должны быть такими:

  • выяснить, поддерживают ли и ваш брокер, и подписчик MQTT 5
  • Проверьте API для своего клиента, чтобы узнать, как использовать группы подписчиков.

1 Впервые в MQTT, у Kafka он уже есть.

person Philip Couling    schedule 24.12.2019
comment
Большое спасибо за ответ. Да, понимаю, если я продолжу использовать MQTT 3.x Broker, тогда я должен использовать Kafka для балансировки нагрузки для служб C ++. - Если несколько экземпляров службы C ++ будут подключены к Kafka в качестве потребителя - Только один раз служба C ++ будет подключена к Kafka в качестве производителя, который будет писать Если я продолжу с MQTT 5, тогда я могу использовать общие подписки, тогда это возможно для балансировки нагрузки на сервисы (c ++). - person Kishore Chilakala; 25.12.2019