五、rabbitMQ消息应答(ack)和消息持久化(durable)

1.消息应答(ack)

//关闭自动应答
boolean autoAck=false;
//监听队列
channel.basicConsume(QUEUE_NAME, autoAck, defaultConsumer);
说明:在上一片博客中,我们用到了rabbitMQ的公平分发的时候,关掉了自动应答如上面所示。rabbitMQ是默认开启自动应答的,这样当rabbitMQ将消息发给消费者,就会从内存中将消息删除,这样会带来一个问题,如果消费者未处理完消息而宕机,那么消息就会丢失。所以,我们将自动应答关闭,当rabbitMQ收到消费者处理完消息的回应后才会从内存中删除消息。
2.消息队列持久化(durable)
//消息队列持久化
boolean durable=false;
//声明队列
channel.queueDeclare(QUEUE_NAME, durable, false, false, null);
说明:rabbitMQ默认将消息存储在内存中,若rabbitMQ宕机,那么所有数据就会丢失,所以在声明队列的时候可以声明将数据持久化, 但是如果已经声明了一个未持久化的队列,那么不能修改,只能将这个队列删除或重新声明一个持久化数据。

### RabbitMQ 配置队列持久化 为了确保RabbitMQ中的数据在服务重启或异常情况下不丢失,配置队列持久化是一项重要措施。通过设置特定参数可以实现这一点。 #### Python代码示例 下面是一个Python脚本的例子,展示了如何创建一个持久化的队列: ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 创建一个名为'my_queue'的队列,并将其设为持久化 channel.queue_declare( queue='my_queue', durable=True, exclusive=False, auto_delete=False, arguments={ 'x-message-ttl': 60000, # 设置消息过期时间为60秒 'x-max-length': 1000 # 设置队列最大长度为1000 } ) connection.close() ``` 这段代码不仅设置了`durable=True`来使队列本身成为持久性的,还利用了额外参数进一步定义了队列的行为[^3]。 当声明了一个持久化的队列之后,在发送消息到该队列时也需要指定这些消息同样应该是持久化的。这通常是在发布者端完成的操作,即当调用`basic_publish()`函数之前先要确认已经启用了消息属性中的`delivery_mode=2`标志位表示这条消息也是持久化的[^4]。 另外值得注意的是,即使实现了上述所有的持久化选项,如果消费者程序崩溃或者断开了连接,则未被应答消息仍然会重新入队等待下一个可用的工作进程处理;而对于那些已经被消费但是还没有提交ACK信号给broker的情况则可能会造成短暂的数据重复现象直到下一次重试为止[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值