-
Notifications
You must be signed in to change notification settings - Fork 22
RabbitMQ Work Queues
L edited this page Jun 6, 2019
·
4 revisions
在工人之间分配任务(竞争消费者模式)
工作队列,Work Queues(又称:任务队列,Task Queues)背后的主要思想是避免立即执行资源密集型任务,并且必须等待它完成。 相反,我们安排任务稍后完成
我们将任务封装为消息并将其发送到队列。 在后台运行的工作进程将弹出任务并最终执行作业。 当您运行许多工作程序时,它们之间将共享任务
这个概念在Web应用程序中特别有用,在这些应用程序中,在短HTTP请求窗口期间无法处理复杂任务
默认情况下,RabbitMQ将按顺序将每条消息发送给下一个消费者
平均而言,每个消费者将获得相同数量的消息
这种分发消息的方式称为循环法
您可能已经注意到调度仍然无法完全按照我们的意愿运行
例如,在有两个工人的情况下,当所有奇数的消息都很重,甚至消息很轻时,一个工人将经常忙,而另一个工作人员几乎不会做任何工作
那么,RabbitMQ对此一无所知,仍然会均匀地发送消息
发生这种情况是因为RabbitMQ只是在消息进入队列时调度消息
它不会查看消费者未确认消息的数量, 它只是盲目地向第n个消费者发送每个第n个消息
为了改变这种行为,我们可以使用BasicQos方法和prefetchCount = 1设置。 这告诉RabbitMQ,在处理并确认前一个消息之前,不要向该工作人员发送新消息
channel.BasicQos(0, 1, false);
void BasicQos(uint prefetchSize, ushort prefetchCount, bool global);