#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:
Возможно, стоит взглянуть на общие подписки 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 непосредственно на шине событий. Я нигде не могу найти поддержку для этого. Пожалуйста, поправьте меня, если я ошибаюсь.