公司消息系统中app 推送,我们知道都是采用第三方付费接口,比如友盟、个推等。发现最近消息发送失败数很多,经过后台查看发现在小部分时间段里发送频率峰值超过了套餐的限制 600/min,大部分时间远远没有达到峰值,套餐升级就会造成成本浪费,所以考虑从程序角度来限流即可。
消息系统部署了3个实例,每个实例最多200/min,这个只需要修改从 RocketMQ 拉取消息的频率和每次从队列中拉取的条数就可以了。
@Override
public void prepareStart(DefaultMQPushConsumer defaultMQPushConsumer) {
// 每次拉取的间隔,5s,1分钟就是拉取12次
defaultMQPushConsumer.setPullInterval(5000);
// 设置每次从队列中拉取的消息数为16,1分钟拉取就是 12 * 16=196,因为一个topic 默认是16个队列,所以每个队列每次拉取 16/16 = 1,
defaultMQPushConsumer.setPullBatchSize(1);
}
1. pullBatchSize 在PushConsumer 模式中默认值是32,注意是每一次从队列拉取的最大数据,针对的是单个队列,所以必须考虑到RocketMQ一个 topic 会创建多个 queue 的特性。
2. 根据经验,我们会认为pullBatchSize 调大点会更好,减少拉取次数处理效率更高,但是有时我们得根据实际情况来做取舍。