【rabbitmq】rabbitmq如何保证消息的可靠性

一、消息丢失
  • 1.生产者把消息发送到rabbitmq服务端,这个过程发生消息丢失
  • 2.rabbitmq服务端收到生产者发过来的消息后,还未持久化宕机而导致消息丢失
  • 3.消费者从服务端收到消息还没来得及处理宕机,导致rabbitmq服务端认为该消息已被签收,而实际是丢失
二、生产者到服务端
  • 1.rabbitmq提供了一个confirm确认机制,生产者把消息发送给rabbitmq服务端
  • 2.服务端收到消息会给生产者返回一个ack的消息
  • 3.生产者可以根据ack的消息来确认是否要对消息进行重新发送,确保消息到达rabbitmq服务端
三、服务端
  • 1.开启消息持久化
  • 2.服务端收到生产者发过来的消息后持久化到磁盘中
  • 3.宕机重启也会从磁盘中读取消息
四、服务端到消费端
  • 1.消息从服务端到消费者,消费者可以将消息签收的自动确认机制改为手动确认ack方式
  • 2.消费者手动调用消息确认方法来表示这个消息已经被签收
RabbitMQ中可以通过持久化和确认机制来保证消息可靠性。 1. 持久化:通过将消息标记为持久化,可以确保消息RabbitMQ重启后不会丢失。可以在发送消息时设置消息的delivery_mode属性为2,表示将消息标记为持久化。同时,还需要将队列和交换机都设置为持久化,以确保它们在RabbitMQ重启后不会丢失。 2. 确认机制:RabbitMQ提供了确认机制来确保消息可靠性生产者在发送消息后,可以等待RabbitMQ的确认回执。如果收到了确认回执,表示消息已经被正确地投递到了队列中。如果没有收到确认回执,生产者可以选择重新发送消息。确认机制可以通过设置channel的confirm_select属性来启用。 下面是一个示例代码,演示了如何在RabbitMQ保证消息可靠性: ```python import pika # 连接到RabbitMQ服务器 connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 创建一个持久化的队列 channel.queue_declare(queue='my_queue', durable=True) # 发送一条持久化的消息 channel.basic_publish(exchange='', routing_key='my_queue', body='Hello, RabbitMQ!', properties=pika.BasicProperties( delivery_mode=2 # 设置消息的delivery_mode属性为2,表示持久化 )) # 启用确认机制 channel.confirm_select() # 等待确认回执 if channel.wait_for_confirms(): print("消息已成功投递到队列中") else: print("消息投递失败") # 关闭连接 connection.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王佑辉

老板,赏点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值