【问题标题】:MQTT consumer in cluster solution (akka, vert.x or ?)集群解决方案中的 MQTT 消费者(akka、vert.x 或?)
【发布时间】:2018-01-11 01:26:26
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

可能值得关注 MQTT 共享订阅(MessageSight 或 HiveMQ 等一些代理支持):http://www.hivemq.com/blog/mqtt-client-load-balancing-with-shared-subscriptions/

共享订阅是一种使用 MQTT 进行客户端负载平衡的机制,它允许消费一次消息,因为订阅在许多客户端之间共享。这可以通过 MQTT 标准机制实现。

【讨论】:

    【解决方案2】:

    据我所知,您应该能够在您的 akka 集群中创建一个单例 akka 骆驼消费者。你应该这样做:

    一旦你定义了你的 Akka Camel Consumer:

    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 High Availability and Fail-Over 确保您的 Verticle 的(单个)实例部署在集群中。

      【讨论】:

      • 其实我发现 vert.x 的 camel-bridge 是用来接收/发送消息给骆驼的,但事实上,我需要我的 vert.x 应用程序能够从 mqtt 主题中消费直接到事件总线。我在任何地方都找不到支持。如果我错了,请纠正我。
      猜你喜欢
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      相关资源
      最近更新 更多