Rabbitmq& MQTT - 客户端集群的体系结构

时间:2014-12-19 19:27:15

标签: rabbitmq mqtt

我有几个服务器(用于加载)用通配符监听所有消息(MQTT),但是我只需要每个消息只由一个服务器处理一次。我该如何设计呢?

谢谢你们!

2 个答案:

答案 0 :(得分:1)

这听起来像是一个包含许多消费者的“经典”消息队列的用例。请注意,root-wildcard订户是MQTT中的一个巨大的反模式,因为如果没有实现复杂的背压处理,消耗缓慢的客户端会降低整个系统的速度。

我看到人们通过以下架构做了类似的事情:

  1. 位于MQTT边缘的HiveMQ MQTT broker。此代理实现了一个自定义插件(使用开源插件系统),该插件将每个MQTT消息(使用JMS,AMQP或HTTP)转发到另一个消息代理(如AWS SQS)。
  2. 消费者只是将消息从消息队列中消失。
  3. 这在云环境中非常有效,特别是因为您不必关心扩展消息队列,例如SQS为您自动完成此操作。您可以在边缘添加更多HiveMQ服务器,后端MQ也可以扩展。

    此解决方案的优点是,您可以很好地扩展,因为所有组件都是可复制的,如果您的MQTT负载增加,您可以拥有更多HiveMQ(例如在集群中),如果更多负载是您可以扩展您的消费者待处理。

    HiveMQ 3(将于2015年第一季度发布)将支持您开箱即用的所需行为(在订阅者之间以仅发送一次的语义分发主题上的消息),因此无需任何其他系统即可完美运行。但是,你必须等待几个月的这种开箱即用的解决方案。

    强制性免责声明:我一如既往地参与开发HiveMQ:这个答案可能有偏见。

答案 1 :(得分:0)

在这种情况下,几乎不可能保证每条消息只处理一次。

消费者在处理完消息后可能会失败,但在消息被删除之前,这意味着该消息仍然在队列中并且可以再次处理。

您可以在消费者处重复消息 - 也就是说,消费者可以在某处存储已处理消息的ID,以便它可以检查每个新的传入消息以查看它是否已经被处理过。如果有,只需回复消息,不要再次处理。由于您已经扩展了消费者,因此需要在所有消费者之间共享重复数据删除存储(例如,数据库)。

即使这项措施也不会严格保证只处理一次 - 请点击此处了解详情:http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2010-August/008272.html