rabbit入门(三)工作队列轮询分发和公平分发

rabbit是一个消息代理和队列服务器。在实际开发当中,生产者发送消息是简单的,只需将消息放入消息中间件的时候就好,消费者接受消息后需要处理业务,可能需要花费很长时间,这个时候队列就会出现积压。为了尽快处理队列消息,一般就是开启多个消费者即一个队列对应多个消费者。队列消息可以通过轮询分发的方式分发给消费者,也可以通过公平分发方式分发给消费者。

轮询分发

在轮询分发的场景下,交换机并不知道后面消费者的消费能力,就两个消费者一人一个这样轮询
缺点:不同消费者处理任务的时间是不一样的,这样会造成性能浪费

公平分发

公平分发的本质就是能者多劳
1,使用公平分发,必须关闭自动应答ack,然后改成手动应答方式。
2,每个消费者发送确认消息之前,消息队列不发送下一个消息到消费者,一次只处理一个消息。
限制发送给同一个消费者不得超过1条消息。
3,消费者增加了channel.basicQos(1)控制同一消息消费次数。
在spring boot里面的配置

publisher-confirms: true  #消息发送到交换机确认机制,是否确认回调
    publisher-returns: true   #消息发送到交换机确认机制,是否返回回调
    listener:
      simple:
        acknowledge-mode: auto    #自动应答ack auto   manual 手动跟新,设置auto,则就是公平分发
        concurrency: 1              #定义最小的消费者数量
        max-concurrency: 100       #定义最大的消费者数量
        retry:
          enabled: false          #是否支持重试
          #将自动应答模式关闭,即开启acknowledge机制
        prefetch: 0              #预读设置,prefetch默认是1,如果设置为0就是轮询模式;就是告诉同一时间将几个消息给消费者,

rabbitmq持久化

在发送端喝接收端都声明持久化,在声明之后,当消息中间件奔溃之后,消息中的队列还存在着,但消息不在了。
持久化消息设置

channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='hello',
                      properties=pika.BasicProperties(
                          delivery_mode=2,  # make message persistent
                      ))
 
# 增加properties,这个properties 就是消费端 callback函数中的properties
# delivery_mode = 2  持久化消息

你可能感兴趣的:(rabbit入门(三)工作队列轮询分发和公平分发)