代码的参数说明在 第一小节的代码中,如果需要可移步到第一节中查看
工作队列
工作队列(又称:任务队列——Task Queues)是为了避免等待一些占用大量资源、时间的操作。当我们把任务(Task)当作消息发送到队列中,一个运行在后台的工作者(worker)进程就会取出任务然后处理。当你运行多个工作者(workers),任务就会在它们之间共享。
使用工作队列的一个好处就是它能够并行的处理队列。如果堆积了很多任务,我们只需要添加更多的工作者(workers)就可以了,扩展很简单。
当我们在 n个Terminal 窗口中,运行消费者程序,就可以有多个消费者处理生产者生产的消息了 当队列中的消息发送给消费者1的时候,就不会再发送给消费者2了。
消息确认
当我们处理消息的时候, 我们想知道,消费者在处理的过程中是否已经处理完成,没有出现消费者挂机的状态,这里就需要消息确认了, 不然队列中的消息是否处理完成,不能明确, 有可能会丢失重要的数据。
消息响应默认是开启的。之前的例子中我们可以使用no_ack=True标识把它关闭。是时候设置的第四个参数basic_consume为false (true 意味着不响应ack) ,当工作者(worker)完成了任务,就发送一个响应。
公平调度
RabbitMQ只管分发进入队列的消息,不会关心有多少消费者(consumer)没有作出响应。它盲目的把第n-th条消息发给第n-th个消费者。 不会等侍是否处理完成
我们可以使用basic.qos方法,并设置prefetch_count=1。这样是告诉RabbitMQ,再同一时刻,不要发送超过1条消息给一个工作者(worker),直到它已经处理了上一条消息并且作出了响应。这样,RabbitMQ就会把消息分发给下一个空闲的工作者(worker)。
生产者
消费者
测试结果,两个 工作队列分别处理了,同一个生产者的数据,并且没有重复