Rabbitmq:工人如何才能;“忽略”;发送一条消息,并让其他工作人员处理

Rabbitmq:工人如何才能;“忽略”;发送一条消息,并让其他工作人员处理,rabbitmq,Rabbitmq,这是我目前的架构 我有一堆物联网设备,它们通过原始双工持久TCP连接到我的“worker”的1个实例,该“worker”连接到RabbitMQ队列 我的出版商发布了一些类似这样的消息 { "iot_device_name" : "A", "command" : "reboot" } 然后,工作者能够将物联网设备\u名称映射到TCP套接字 所有这些都工作得很好,但如果我们想添加HA并扩展一点,最好有4个worker实例。负载平衡TCP问题不是问题(对于HaProxy或Nginx) 现

这是我目前的架构

我有一堆物联网设备,它们通过原始双工持久TCP连接到我的“worker”的1个实例,该“worker”连接到RabbitMQ队列

我的出版商发布了一些类似这样的消息

{
   "iot_device_name" : "A",
   "command" : "reboot"
}
然后,工作者能够将
物联网设备\u名称
映射到TCP套接字

所有这些都工作得很好,但如果我们想添加HA并扩展一点,最好有4个worker实例。负载平衡TCP问题不是问题(对于HaProxy或Nginx)

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

那么有没有办法让员工说:“嗯,不,我不能处理此消息,因为我不知道此设备,请给我另一个”,这样其他员工就可以处理它了?

其他可能有用的信息:

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

因此,如果我正确理解了您的体系结构,您可以将命令发送到发布服务器的一侧,并将其推送到rabbitmq中。 在用户端,您有多个工作进程,消息被分派到这些工作进程,每个工作进程都有一组连接到它的设备

如果这确实是您的体系结构,我将为您的rabbitmq配置提出以下建议:

  • 使用直接交换
  • 每个工作进程都有自己的队列(独占),并动态管理exchange与其队列之间的绑定:
    • 每次设备连接到工作进程时,该工作进程都会在其队列和exchange之间添加一个绑定,并将该设备的标识符作为路由密钥
    • 每当工作程序检测到设备不再连接到它时,他就会从rabbitmq配置中删除相关绑定
  • 与检测断开连接的设备相关,我认为在接收到推送到设备的命令时,工作人员会意识到设备不再与设备连接,在这种情况下,除了调整绑定外,工作人员还会使用相同的路由密钥将消息重新发布到相同的交换机,这样它就可以被合适的工人再次使用
  • <>我也会考虑在队列上配置TTL,在消耗太旧的消息时没有任何意义。
  • 发布者当然还需要修改消息,包括作为路由密钥的预期设备标识

我希望这里的建议是有意义的,还有一些其他情况需要考虑:备用交换,以确保在设备没有重新连接到工作设备的(短)时间内,我们不会丢失请求,并且无论如何,我们都会得到一个命令,向重新发布的消息添加属性,以确保不会在系统中添加无限循环。。。但是上面提到的应该是实现你的目标的合理起点

你的答案似乎就是我想要的:),只是一些小问题:1。拥有潜在的10k路由密钥可以吗?(最高50k)2。如果我的一个工作人员死了,会发生什么?当然,问题是什么,你想要什么精度?对不起,我按enter键太快了,我编辑了我的评论。还没有那么多绑定的案例,我希望你的rabbitmq提供足够的资源(打开的文件数、内存等),它可以保存,但这需要测试。哦,我在想,有没有可能(我是rabbitmq新手)在扇出中有一个交换,链接到每个工作者的一个队列,这样所有工作者的所有消息都会排队,当工作者与他们无关时,他们只会消费而不做任何事情?这样我们就不必进行大量绑定,如果一个工人死亡,IoT设备将重新连接到另一个工人,该工人现在可以处理其消息了?