rabbitmq篇---rabbitmq接收端消息接收不全之解决办法
·
https://www.cnblogs.com/bigberg/p/8137068.html
1. 消息分发

2. 消息确认
在实际应用中,可能会发生消费者收到Queue中的消息,但没有处理完成就宕机(或出现其他意外)的情况,这种情况下就可能会导致消息丢失。为了避免这种情况发生,我们可以要求消费者在消费完消息后发送一个回执给RabbitMQ,RabbitMQ收到消息回执(Message acknowledgment)后才将该消息从Queue中移除;如果RabbitMQ没有收到回执并检测到消费者的RabbitMQ连接断开,则RabbitMQ会将该消息发送给其他消费者(如果存在多个消费者)进行处理。这里不存在timeout概念,一个消费者处理消息时间再长也不会导致该消息被发送给其他消费者,除非它的RabbitMQ连接断开。
如何实现呢?
1. 将 auto_ack=False,当然api默认是False
channel.basic_consume(queue=self.queueName,
on_message_callback=on_message_callback,
auto_ack=False # 自动发送确认消息
)
auto_ack 就 auto acknowlegment的意思,这个参数会导致RabbitMQ并不关心消费者有没有处理完成,可能在消费者获取消息后就将该消息从Queue中移除。去掉这个参数,如果在消费者执行过程当初出现了意外(宕机),RabbitMQ没有收到消息回执,就会发送给其他消费者执行。
2. 修改consumer端
def on_message_callback(channel, method, properties, body):
"""
:param channel:
:param method:
:param properties:
:param body:
"""
# 将收到的消息从json转为string
# message = json.loads(body)
time.sleep(30) # 让消费者处理的时间长一点,可以用来模拟运行中断开的情况
print("*"*100)
print(" [received] %r : %r" % (method.routing_key, body.decode()))
logger.info(" [received] %r : %r" % (method.routing_key, body.decode()))
channel.basic_ack(delivery_tag=method.delivery_tag) # 确认消息被执行完毕,主动告知rabbitMQ
更多推荐

所有评论(0)