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);
}
}
推荐阅读
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- Node.js中readline模块实现终端输入
- django-前后端交互
- 移动端h5调试方法
- “沉溺”疫情
- Jsr303做前端数据校验
- 40under40|40under40|思想会-那什么拯救你,我的"高端"甲方"爸爸"
- 端银×八正道|端银×八正道 | 21天百万实操信用卡特训营045+Dodo第5次作业
- 7、前端--jQuery简介、基本选择器、基本筛选器、属性选择器、表单选择器、筛选器方法、节点操作、绑定事件
- 端午偶感