一、背景介绍:
1、rocketmq延迟消息:定时消息(延迟队列)是指消息发送到broker后,不会立即被消费,等待特定时间投递给真正的topic;
定时消息会暂存在名为SCHEDULE_TOPIC_XXXX的topic中,并根据delayTimeLevel存入特定的queue,queueId = delayTimeLevel – 1,即一个queue只存相同延迟的消息,保证具有相同发送延迟的消息能够顺序消费。
broker会调度地消费SCHEDULE_TOPIC_XXXX,将消息写入真实的topic。
注意:定时消息会在第一次写入和调度写入真实topic时都会计数,因此发送数量、tps都会变高。
在消息创建的时候,调用 setDelayTimeLevel(int level) 方法设置延迟时间;
2、消息延时级别
消息的延时级别level一共有18级,分别为:
1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
level有以下三种情况:
level == 0,消息为非延迟消息
1<=level<=maxLevel,消息延迟特定时间,例如level==1,延迟1s
level > maxLevel,则level== maxLevel,例如level==20,延迟2h
二、信令风暴问题分析
如上图当发生信令风暴时,扩散写消息的数据首先会出现突增,出现读写性能瓶颈, 接着pushtopicMQ也出现堆积瓶颈, 同时由于客户端短时间内收到大量信令,客户端也出现了处理瓶颈。
三、信令风暴问题解决方案
1、通过对整个数据流程的分析, 发现很多信令其实是代表同一个含义, 所以可以对消息进行合并和去重,这样的话,消息的总量变由指数级别变为线性级别,就能解决信令风暴问题,
2、对消息进行hashcode计算,以hashcode和用户id为去重标识
3、利用rockmq的延迟消息机制,可以对延迟时间内的消息进行合并去重过滤处理
4、为了避免延时合并带来实时性下降的损耗,在去重过滤时可以选择在时间周期内首次不去重,后续再进行去重处理,可以兼顾效果与实时性