RabbitMQ------------消费端精确限流

推荐公众号

程序员探索之路

正文

消费端限流目的是避免消息洪峰是消费端服务挂掉,RabbitM有一个配置prefetch属性
spring:
  rabbitmq:
    listener:
      direct:
        acknowledge-mode: manual #手动签收
        prefetch: 2 # 
/**
		 * Maximum number of unacknowledged messages that can be outstanding at each
		 * consumer.官方解释每一次在消费端可挂起的未确认的最大数量
		 */
		private Integer prefetch;
但是无法精确控制,比如1秒内不能消费超过20条消息,而且在使用中发现这个参数配置哪个数字,一次也只能签收一条。
如果其他建议或想法欢迎交流
LZ想到的解决方案,一次签收一条+com.google.common.util.concurrent.RateLimiter达到精确控制,例如想控制1秒内消费不超过20//1秒只能放20个令牌
private RateLimiter rateLimiter = RateLimiter.create(20);
    @RabbitHandler
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "order_queue3", durable = "true"),
            exchange = @Exchange(
                    value = "order_exchange",
                    ignoreDeclarationExceptions = "true",
                    type = ExchangeTypes.DIRECT,
                    durable = "true"
            ),
            key = {"order_routing"}
    ))
    public void listen( Message message, Channel channel) throws IOException {
        LocalDateTime now = LocalDateTime.now();
        log.info("order_queue,接收时间=[{}],order=[{}]", now.toString(), message);
        try {
            //todo 处理
            sum();
            //获取令牌
            rateLimiter.acquire();
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
            log.error("error", e);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值