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 持久化消息
网友评论