Rabbitmq:工人如何能够忽略"一条消息,让其他工人对待它

时间:2018-02-02 17:31:47

标签: rabbitmq

这是我目前的架构

我有一堆物联网设备,通过原始双工持久TCP连接到我的" worker"连接到RabbitMQ队列

我的发布商发布了一些类似的消息

iot_device_name

然后,worker可以将{{1}}映射到TCP套接字。

一切都运行良好,但是如果我们想要添加HA并稍微扩展一下,那么拥有4个worker实例会更好。负载平衡TCP问题不是问题(使用HaProxy或Nginx)。

现在的问题是如何拆分队列部分的负载,因为工作人员处理的物联网设备列表是动态的(即设备可以断开连接并重新连接到其他工作人员)

所以有一种方法可以让工人说:"嗯,我不能对待这条消息,因为我不知道这个设备,给我另一个"那么其他工人可以接受并处理它吗?

可能有帮助的其他信息:

  • 工作人员都在同一个网络中,也与发布者相同
  • 工作人员数量不是动态的,即使我们推断未来几年的设备数量,8名工作人员也会花费很多时间,因为它只是路由消息/转码消息,所以他们的CPU负载是荒谬的。

1 个答案:

答案 0 :(得分:1)

因此,如果我正确理解您的体系结构,您可以将命令发送到您的发布者,并将其推送到rabbitmq。 在消费者方面,您有多个工作人员,分派消息,每个工作人员都有一堆设备连接到它。

如果确实这是您的架构,我会为您的rabbitmq配置提出以下建议:

  • 使用直接交换
  • 每个worker都有自己的队列(独占),并动态管理交换机及其队列之间的绑定:
    • 每次设备连接到工作人员时,该工作人员在其队列与交换机之间添加绑定,并将路由密钥作为设备的标识符
    • 每次工作人员检测到设备未再连接到设备时,他会从rabbitmq配置中删除相关绑定
  • 与检测到断开连接的设备有关,我希望通常会在收到一个命令推送到设备时工人意识到设备已经不再连接到它了,在这种情况下除了适应绑定,工作人员会使用相同的路由键将消息重新发布到同一个交换机,以便它可以让另一个镜头被正确的工作者使用
  • 我还考虑在队列中配置TTL,消耗太旧的消息毫无意义
  • 发布者当然也需要更改消息,包括将预期的设备标识作为路由密钥

我希望这里的提案有意义,还有一些其他案例需要考虑:备用交换以确保在设备未重新连接到工作人员的(短)期间我们不会丢失请求无论如何我们得到一个命令,为重新发布的消息添加一个属性,以确保我们不在系统中添加无限循环,...但是上面指出的应该是实现目标的合理起点