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

目录

      • 推荐公众号
      • 正文

推荐公众号

有彩蛋哦!!!(或者公众号内点击网赚获取彩蛋)
程序员探索之路
如有其它意见欢迎指正微信 zzh_1_2_3

正文

消费端限流目的是避免消息洪峰是消费端服务挂掉,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);
        }
    }

你可能感兴趣的:(RabbitMQ)