RabbitMQ 处理unacked消息

本文详细介绍了RabbitMQ中由于消费者未确认消息导致的队列阻塞问题,以及如何通过QOS(服务质量保证)功能来避免这种情况。RabbitMQ的PrefetchCount设置用于限制消费者未确认消息的最大数量,以此实现削峰限流。通过设置并发消费者数量和手动确认模式,可以有效地控制队列状态,避免队列阻塞。当未确认消息数量超过预设阈值时,可能会出现队列阻塞风险,需要及时处理未确认消息。
摘要由CSDN通过智能技术生成

       原因:消费端由于没有确认消息,导致队列阻塞,这是RabbitMQ的一种保护机制。防止当消息激增的时候,海量的消息进入consumer而引发consumer宕机。

       RabbitMQ提供了一种QOS(服务质量保证)功能,即在开启手动确认消息的前提下,限制信道上的消费者所能保持的最大未确认的数量。可以通过设置PrefetchCount实现。

  举例说明:可以理解为在consumer前面加了一个缓冲容器,容器能容纳最大的消息数量就是PrefetchCount。如果容器没有满RabbitMQ就会将消息投递到容器内,如果满了就不投递了。当consumer对消息进行ack以后就会将此消息移除,从而放入新的消息。

// 最小并发数
container.setConcurrentConsumers(1);
// 最大并发数
container.setMaxConcurrentConsumers(5);
// 削峰限流:消费端限流,一次处理一条数据。
container.setAcknowledgeMode(AcknowledgeMode.MANUAL); // RabbitMQ默认是自动确认,这里改为手动确认消息
//一次处理的消息数量
container.setPrefetchCount(2);

//参数为0,轮询发送处理的消息,一次一条 
container.setPrefetchCount(0);
			

判断队列的阻塞风险

当ack模式为manual,并且线上出现了unacked消息,这个时候不用慌。由于QOS是限制信道channel上的消费者所能保持的最大未确认的数量。所以允许出现unacked的数量可以通过channelCount * prefetchCount * 节点数量 得出。

channlCount就是由concurrency,max-concurrency决定的。

min = concurrency * prefetch * 节点数量
max = max-concurrency * prefetch * 节点数量
由此可以的出结论
unacked_msg_count < min 队列不会阻塞。但需要及时处理unacked的消息。
unacked_msg_count >= min 可能会出现堵塞。
unacked_msg_count >= max 队列一定阻塞。


 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ 是一个可靠的消息中间件,但在特定情况下,仍可能会发生消息丢失。以下是一些处理消息丢失的常见方法: 1. 持久化消息:在发送消息时,可以将消息标记为持久化(persistent),这样 RabbitMQ 会将消息存储在磁盘上,即使在服务器重启或崩溃后也不会丢失。同时,确保消费者在接收消息时也设置了持久化标志。 2. 合理设置消息的 TTL(Time-To-Live):通过设置消息的过期时间,可以避免消息在队列中长时间滞留,从而减少消息丢失的可能性。可以根据业务需求设置合适的 TTL 值。 3. 使用确认机制(ACK):RabbitMQ 提供了消息确认机制,消费者在处理完一条消息后发送确认(ACK)给 RabbitMQ,表示该消息已被成功处理。如果消费者在处理消息时发生异常或崩溃,RabbitMQ 将重新将该消息发送给其他消费者处理,确保消息不会丢失。 4. 设置备份交换器(Alternate Exchange):备份交换器是一个用于处理未能被正确路由到队列的消息的交换器。当消息发送到交换器时,如果无法路由到任何队列,则消息将被发送到备份交换器中,从而避免消息丢失。 5. 使用发布确认(Publisher Confirm)机制:在生产者发送消息后,可以等待 RabbitMQ 发送确认给生产者,表示消息已经成功到达交换器。如果超过一定时间仍未收到确认,则可以选择重发消息,确保消息不会丢失。 6. 设置队列的最大长度和溢出行为:通过设置队列的最大长度和溢出行为,可以控制队列中消息的数量。当队列已满时,可以选择丢弃新的消息或将其发送到备份交换器或死信队列中。 综上所述,通过合理设置消息的持久化、TTL、确认机制、备份交换器、发布确认机制以及队列的最大长度和溢出行为,可以最大程度地减少消息丢失的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值