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


目录

      • 推荐公众号
      • 正文

推荐公众号
【RabbitMQ------------消费端精确限流】有彩蛋哦!!!(或者公众号内点击网赚获取彩蛋)
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 = https://www.it610.com/article/@Queue(value ="order_queue3", durable = "true"), exchange = @Exchange( value = "https://www.it610.com/article/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); } }

    推荐阅读