Потребитель MQTT в кластерном решении (akka, vert.x или ?)

#apache-camel #akka #cluster-computing #mqtt #vert.x

#apache-camel #akka #кластерные вычисления #mqtt #vert.x

Вопрос:

Мы начинаем проект, в котором нам нужно использовать некоторые сообщения из темы MQTT, но наше решение должно работать в кластере с несколькими узлами / экземплярами — должно быть масштабируемым.

Проблема в том, что мы не уверены, какую технологию выбрать. Мы сталкиваемся с такой проблемой, как: на кластер должен быть только 1 потребитель, другими словами, нам нужно избегать использования сообщения дважды (если 2 узла)…сообщается, что akka поддерживает singleton в кластере, поэтому это может сработать, но я не уверен, как интегрировать akka с MQTT.

Другая возможность — vert.x. И akka, и vert.x имеют мосты к camel или они поддерживают протокол напрямую? Я видел этот vertx. имеет интеграцию с сервером MQTT, но я не совсем уверен, что это именно то, что нам нужно. Будет ли это работать так, как я себе представляю, с переносом camel в vert.x или akka-cluster?

Комментарии:

1. github.com/akka/akka-stream-contrib/tree/master/mqtt

Ответ №1:

Возможно, стоит взглянуть на общие подписки MQTT (которые поддерживают некоторые брокеры, такие как MessageSight или HiveMQ): http://www.hivemq.com/blog/mqtt-client-load-balancing-with-shared-subscriptions /

Общие подписки — это механизм балансировки нагрузки клиента с помощью MQTT, который позволяет использовать сообщение один раз, поскольку подписка является общей для многих клиентов. Это возможно с помощью стандартных механизмов MQTT.

Ответ №2:

Исходя из того, что я знаю, вы должны иметь возможность создать одноэлементный потребитель akka camel в вашем akka-кластере. Вы должны сделать что-то вроде этого:

После того, как вы определили своего потребителя Akka Camel:

 object CamelConsumer {
  def props = Props(new CamelConsumer())
}

class CamelConsumer extends Consumer {
    def endpointUri = "mqtt://..."

    def receive = {
      //...
    }
}
  

Вы можете определить свой синглтон следующим образом:

 context.actorOf(ClusterSingletonManager.props(
  CamelConsumer.props, 
  PoisonPill, 
  ClusterSingletonManagerSettings(context.system)), "singletonConsumer")
val singletonConsumer = context.actorOf(ClusterSingletonProxy.props(
  singletonManagerPath = "/user/app/singletonConsumer",
  settings = ClusterSingletonProxySettings(system)),
  name = "singletonConsumerProxy")
  

У меня нет опыта работы с Vert.x.

Ответ №3:

Вы можете использовать высокую доступность и отказоустойчивость Vert.x, чтобы убедиться, что (единственный) экземпляр вашей Verticle развернут в кластере.

Комментарии:

1. На самом деле, я узнал, что camel-bridge для vert.x используется для получения / отправки сообщений на camel, но на самом деле мне нужно, чтобы мое приложение vert.x могло использовать темы mqtt непосредственно на шине событий. Я нигде не могу найти поддержку для этого. Пожалуйста, поправьте меня, если я ошибаюсь.