推荐公众号

正文
消费端限流目的是避免消息洪峰是消费端服务挂掉,RabbitM有一个配置prefetch属性
spring:
rabbitmq:
listener:
direct:
acknowledge-mode: manual #手动签收
prefetch: 2 #
private Integer prefetch;
但是无法精确控制,比如1秒内不能消费超过20条消息,而且在使用中发现这个参数配置哪个数字,一次也只能签收一条。
如果其他建议或想法欢迎交流
LZ想到的解决方案,一次签收一条+com.google.common.util.concurrent.RateLimiter达到精确控制,例如想控制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 {
sum();
rateLimiter.acquire();
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
log.error("error", e);
}
}