rabbitmq 队列系统公平地(循环等)处理来自多个客户端的消息

lp0sw83n  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(209)

我有一个简单的RabbitMQ单个队列,它服务于多个处理耗时消息的服务器,这些服务器一起工作来处理消息并清除这个单个队列。
前端的客户端A启动一个作业,每个作业由1,000多条消息组成,这些消息进入一个队列,由大约12台服务器处理,这12台服务器处理来自客户端A的所有1,000多条消息大约需要10分钟
我的问题是,如果客户端B连接到我的站点并启动一个作业。他的消息将进入队列中客户端A的1,000多条消息之后的堆栈。这将导致客户端B必须等到客户端A的所有1,000多条消息都处理完毕之后,才能处理客户端B的任何消息。
我需要一种方法,使我的服务器能够看到客户端A和客户端B消息,并且当服务器完成消息时,随机地或以某种其他方式从客户端A或客户端B中进行选择,使得发生某种平衡,从而允许客户端A和客户端B消息在某种程度上同时被处理,即使客户端B消息在客户端A消息已经在队列中之后很久才到达。
我研究了路由,但这有点棘手,因为我不想预先指定服务器只处理特定客户端的消息,我甚至不知道会有多少客户端。我还希望它是灵活的,如果只有一个客户端,所有服务器都应该全速处理该客户端的消息,直到另一个客户端出现。
我唯一能想到的是,每个新客户端在初始化时都会产生自己唯一的rabbitmq队列。然后,这些动态数量的队列会以循环的方式为单个队列提供数据。服务器会从这个队列中读取数据,这个队列中有很好的客户端组合。

q35jwt9p

q35jwt9p1#

您的每个工作者都应该有自己的队列,从这些队列中使用消息来通知新的“用户”队列。这些工作者队列将绑定到扇出交换。然后,当您的公共API创建一个“用户”队列并向其发布消息时,它也会向扇出交换发送一个“新用户队列”消息,并且每个工作线程都将收到有关新“用户”队列的警报。如果所有工作线程都从“用户”队列使用适当的prefetch/qos值,则消息将按您的预期循环传递给它们。

**注意:**RabbitMQ团队监控rabbitmq-users邮件列表,仅在某些时候回答StackOverflow上的问题。

相关问题