了解rabbit基础,RabbitMq+python实现生产者+消息队列+消费者模型

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连接

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以使用RabbitMQ、Spring Boot和WebSocket来实现前端可发送和接收消息的功能。下面是一个基本的实现步骤: 1. 首先,确保您的Spring Boot项目中已经添加了RabbitMQ和WebSocket的依赖。 2. 在Spring Boot应用程序中配置RabbitMQ,包括连接配置和队列配置。您可以使用`@Configuration`注解创建一个配置类,并使用`@Bean`注解创建一个`ConnectionFactory`和一个`RabbitTemplate`实例。 3. 创建一个消息接收器(Consumer)来监听RabbitMQ队列中的消息。您可以使用`@RabbitListener`注解将一个方法标记为消息接收器,并指定要监听的队列名称。 4. 在Spring Boot应用程序中配置WebSocket,包括处理器和拦截器等。您可以使用`@Configuration`注解创建一个配置类,并使用`@Bean`注解创建一个`WebSocketHandler`和一个`HandshakeInterceptor`实例。 5. 创建一个WebSocket处理器(Handler)来处理前端发送的消息。您可以实现`WebSocketHandler`接口,并重写相应的方法来处理连接、消息发送和关闭等事件。 6. 在WebSocket处理器中,您可以使用RabbitTemplate将接收到的消息发送到RabbitMQ队列中。您可以在处理器的`handleTextMessage()`方法中调用RabbitTemplate的相关方法来发送消息。 7. 在前端页面中,使用JavaScript或其他框架来建立WebSocket连接,并发送和接收消息。您可以使用WebSocket的API来发送和接收消息,并在接收到消息时更新页面内容。 通过以上步骤,您可以实现前端可发送和接收消息的功能。当前端发送消息时,WebSocket处理器会接收到消息并将其发送到RabbitMQ队列中。然后,消息接收器会监听该队列,并将消息发送给其他需要接收该消息的客户端。这样,前端页面就可以实现实时的消息发送和接收功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值