消费端ACK和消费端限流

本文介绍了RabbitMQ中消费端的限流策略,通过设置qos参数实现未确认消息的限制,防止消息过快消费。同时讲解了消费端的手动ACK和NACK机制,ACK用于确认消息成功消费,NACK则导致消息重发,确保消息的可靠传递。在遇到业务异常或服务器问题时,手动ACK能保证消息正确处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.消费端的限流

  1. RabbitMQ提供了一种qos(服务质量保证)功能, 即在非自动确认消息的前提下, 如果一定数目的消息(通过consumer或者channel设置qos的值)未被确认前, 不进行消费新的消息.自动签收要设置成false, 建议实际工作中也设置成false
  2. void basicQos(int prefetchSize, int prefetchCount, boolean global) throws IOException;
    prefetchSize : 消息大小限制, 一般设置为0, 消费端不做限制
    prefetchCount : 会告诉RabbitMQ不要同时给一个消费者推送多于N个消息, 即一旦有N个消息还没有ack, 则该consumer将block(阻塞), 直到有消息ack
    global : true/false 是否将上面设置应用于channel, 简单来说就是上面的限制是channel级别的还是consumer级别
    备注:
    prefetchSize和global这两项, RabbitMQ没有实现, 暂且不关注, prefetchCount在autoAck设置false的情况下生效, 即在自动确认的情况下这两个值是不生效的
 //限流方式 每次只推3条
 channel.basicQos(0,3,false);
 // 设置Channel autoAck一定要设置为false,才能做限流
 channel.basicConsume(queueName,false,new MyConsumer(channel));

二.消费端的手工ACK和NACK

ACK是确认成功消费, NACK表示消息处理失败, 会重发消息

  1. 消费端进行消费的时候, 如果由于业务异常我们可以进行日志的记录, 然后进行补偿
  2. 如果由于服务器宕机等严重问题, 就需要手工进行ACK保障消费端消费成功

消费端手动签收ack

 // 手动签收
 channel.basicAck(envelope.getDeliveryTag(),false);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值