我们正在启动一个项目,我们需要使用来自 MQTT 主题的一些消息,但我们的解决方案需要在具有多个节点/实例的集群中工作 - 需要可扩展。
问题是,我们不确定选择何种技术。我们面临的问题是:每个群集只需要一个消费者,换句话说,我们需要避免两次消费消息(如果是2个节点)...... akka 据说支持群集中的单例,所以这可能有效,但我不确定如何将akka与MQTT集成。
另一种可能性是 vert.x 。 akka和vert.x都有通向 camel 的桥梁,或者它们直接支持协议?我看到了那个vertx。有MQTT服务器集成,但我不太确定这是否正是我们所需要的。它会像我想象的那样将camel包装到vert.x或akka-cluster吗?
答案 0 :(得分:3)
可能值得查看MQTT共享订阅(某些代理如MessageSight或HiveMQ支持):http://www.hivemq.com/blog/mqtt-client-load-balancing-with-shared-subscriptions/
共享订阅是使用MQTT进行客户端负载平衡的机制,它允许消息一次,因为订阅在许多客户端之间共享。这可以通过MQTT标准机制实现。
答案 1 :(得分:1)
根据我所知,你应该能够在你的akka集群中创建一个单身akka camel消费者。你应该这样做:
一旦您定义了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的经验。
答案 2 :(得分:1)
您可以使用Vert.x High Availability and Fail-Over确保在群集中部署Verticle的(单个)实例。