转自:https://blog.csdn.net/zzaric/article/details/80641786
redis
应用场景以下:服务器
公司内有多个业务系统,因为业务系统内有向用户发送消息的服务,因此经过统一消息系统对外暴露微服务接口供外部业务系统调用,全部公司内业务系统的消息(短信,APP,微信)推送都由统一消息系统去推送,短信推送须要走外部短信通道商去发送短信,APP和微信走内部系统的push服务器,可是无论是短信通道商仍是内部push服务器都会有每秒上限的控制。在这假设n/s条。微信
如下是统一消息系统内部的具体的限流方案:微服务
时间限流队列以下:.net
1.统一消息中心接受消息m条,假定这m个待推送消息的推送时间为t1。线程
2.由于时间限流队列的长度是n条,如今有m条要进时间限流队列,因此队列里必需要有n-m个长度才能保证新进来的m条待发送消息才能进入队列。blog
3.因此断定队列里第n-m对应的时间点要比这m条待发送消息的发送时间小于1个单位秒时,即 t1-t2>1s,才能保证n/s条的速率。接口
4.经过第3部t1-t2>1s?判断是否知足新来的m条待发送消息的发送时间是否比时间限流队列第n-m条对应的时间大于1个单位秒时,若是大于1个单位秒时,说明t1时间对应的上一秒对应的n条消息都已经发送,这时经过lpush命令循环将m条待发送消息推入时间限流队列。若有没有主线程睡眠1/10个秒时,轮询执行步骤一,直至m套待发送消息对应的发送时间t1进入至时间限流队列。队列
5.执行时间滑动窗口步骤,截取redis队列0 - n的长度数据,如图所示。
循环