RabbitMQ
一.
RabbitMq是一个基于AQMP实现的消息队列中间件,可以实现异步处理,流量削峰,系统解耦
- 异步处理:消息队列可以实现异步通讯,生产者将消息发送到队列中,消费者从队列中获取消息进行处理。不需要进行相互调用,无需等待对方响应,从而实现异步处理
- 流量削峰:在高并发情况下通过将消息队列进行排队,缓存流量的峰值,控制消息队列中消息的数量,从而达到削峰效果
- 系统解耦:将发送者和接收者解耦,通过将消息发送到消息队列中,消费者从队列中获取消息。生产者和消费者不再直接依赖彼此从而实现解耦
消息队列工作流程
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=img_1.png&pos_id=i
mg-NjLj0wro-1696918221429)
在MQ中消息的生命周期
- 消息的生命周期起始生产者将消息发送到队列中
- 一旦消息被生产者发布,它进入了消息队列中的存储阶段。在这个阶段,消息可能会被持久化存储,以确保即使在系统故障或重启后,仍然能够保留未被消费的消息
- 消费者从消息队列中获取消息进行处理。
- 消费者完成消息处理后,通常会向消息队列发送确认消息,表示该消息已经被成功处理。这样,消息队列可以安全地将消息从队列中删除。如果消费者在处理消息时发生错误或异常,它可以向消息队列发送回滚请求,要求重新投递消息。
- 可以设置消息的生存时间。这样可以实现消息的定时发送、消息延迟处理等功能。
- 当消息被所有需要处理的消费者都成功处理后,消息的生命周期就结束了。消息队列可以将消息从队列中删除或标记为已消费。
二.python操作MQ
MQ生产和消费者
生产者
import pika
import json
credentials = pika.PlainCredentials('guest', 'guest') # mq用户名和密码
# 虚拟队列需要指定参数 virtual_host,如果是默认的可以不填。
connection = pika.BlockingConnection(pika.ConnectionParameters(host = '127.0.0.1',port = 5672,virtual_host = '/',credentials = credentials))
channel=connection.channel()
# 声明消息队列,消息将在这个队列传递,python-test是队列名 durable = True持久化储存
result = channel.queue_declare(queue = 'python-test',durable = True)
for i in range(10):
message=json.dumps({'OrderId':"1000%s"%i}) #交换机绑定路由键。这里选择默认Exchage
channel.basic_publish(exchange = '',routing_key = 'python-test',body = message)
print(message)
connection.close()
消费者
import pika
credentials = pika.PlainCredentials('guest', 'guest')
connection = pika.BlockingConnection(pika.ConnectionParameters(host = '127.0.0.1',port = 5672,virtual_host = '/',credentials = credentials))
channel = connection.channel()
# 申明消息队列,消息在这个队列传递,如果不存在,则创建队列
channel.queue_declare(queue = 'python-test', durable = False)
#定义消息消费的回调函数
def callback(ch, method, properties, body):
print("Received message:", body)
# 告诉 RabbitMQ 使用定义的回调函数来消费队列中的消息
channel.basic_consume(queue='python-test', on_message_callback=callback, auto_ack=True)
# 开始消费消息
channel.start_consuming()
三. MQ和redis的区别比较
数据类型和功能
- MQ是一种消息队列系统,主要用于消息的传输分发,提供消息处理。如消息持久化,消息确认,消息路由。
- redis是一个高性能键值存储系统,支持大量数据类型(字符串,列表,集合,哈希值等),有缓存发布订阅,计数等功能。redis主要利用于快速读写操作。
消息模型 - MQ基于“生产者-中间队列-消费者”模型,消息在生产者消费者之间传递,生产者将消息发送到消息队列中,消费者从队列中获取消息进行处理。
- Redis提供发布-订阅模式,生产者将消息发布到指定的频道,订阅该频道的消费者即可接收到消息。
性能 - redis是基于内存的存储系统,支持快速读写,可以处理大量消息的订阅和发布
- MQ通过优化消息的分发和路由机制来提供高性能的消息传递。但与Redis相比,在处理大量消息会有很大的时间开销。
四. 当消费者在处理消息发生失败异常时处理方法
-
重试机制:可以尝试对失败的消息进行重试。这可以通过重新将消息发送回消息队列,并增加一些延迟时间来实现。消息队列系统通常提供了延迟队列或延迟投递的功能,可以将消息延迟一段时间后再次投递给消费者。通过重试机制,可以期望在稍后的时间或下一次消费尝试中成功地处理消息
-
死信队列(Dead Letter Queue):如果消息重试多次仍然失败,可以将该消息从原始队列转移到死信队列中。死信队列是一个专门用于存储无法被消费者正确处理的消息的队列。将消息放入死信队列后,可以进行进一步的分析、处理或报警。
-
人工干预:对于某些特殊情况,无法通过自动化措施解决时,可能需要人工干预来处理失败的消息。例如,通知相关人员进行手动处理、修复消费者程序或重新发布消息等。
-
补充消息的生命后期
-
补充消费者消费失败后怎么处理
git连接:git连接