集群解决方案中的MQTT使用者(akka,vert.x或?)

时间:2016-10-17 19:03:08

标签: apache-camel akka cluster-computing mqtt vert.x

我们正在启动一个项目,我们需要使用来自 MQTT 主题的一些消息,但我们的解决方案需要在具有多个节点/实例的集群中工作 - 需要可扩展。

问题是,我们不确定选择何种技术。我们面临的问题是:每个群集只需要一个消费者,换句话说,我们需要避免两次消费消息(如果是2个节点)...... akka 据说支持群集中的单例,所以这可能有效,但我不确定如何将akka与MQTT集成。

另一种可能性是 vert.x 。 akka和vert.x都有通向 camel 的桥梁,或者它们直接支持协议?我看到了那个vertx。有MQTT服务器集成,但我不太确定这是否正是我们所需要的。它会像我想象的那样将camel包装到vert.x或akka-cluster吗?

3 个答案:

答案 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的(单个)实例。