博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于redis+lua实现高并发场景下的秒杀限流解决方案
阅读量:4577 次
发布时间:2019-06-08

本文共 720 字,大约阅读时间需要 2 分钟。

转自:https://blog.csdn.net/zzaric/article/details/80641786

应用场景如下:

公司内有多个业务系统,由于业务系统内有向用户发送消息的服务,所以通过统一消息系统对外暴露微服务接口供外部业务系统调用,所有公司内业务系统的消息(短信,APP,微信)推送都由统一消息系统去推送,短信推送需要走外部短信通道商去发送短信,APP和微信走内部系统的push服务器,但是不管是短信通道商还是内部push服务器都会有每秒上限的控制。在这假设n/s条。

 

以下是统一消息系统内部的具体的限流方案:

 

时间限流队列如下:

 

1.统一消息中心接受消息m条,假定这m个待推送消息的推送时间为t1。

2.因为时间限流队列的长度是n条,现在有m条要进时间限流队列,所以队列里必须要有n-m个长度才能保证新进来的m条待发送消息才能进入队列。

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的长度数据,如图所示。

转载于:https://www.cnblogs.com/taozi32/p/10419851.html

你可能感兴趣的文章
python常用sql语句
查看>>
IE 下a标签在 position:absolute 后无法点击的问题
查看>>
JDBC如何调用存储过程
查看>>
扫盲记-第五篇--图像全景分割
查看>>
Linux之Ganglia源码安装
查看>>
Android中的Handler,Looper,Message机制
查看>>
魔幻之翼的博客
查看>>
文件发送成功率低的问题(1)
查看>>
去掉SrollView、GrdiView、ListView、ViewPager等滑动到边缘的光晕效果
查看>>
我选择的……
查看>>
akka actor初探
查看>>
linux清理Java环境
查看>>
java中使用session的一些细节
查看>>
浏览器输入服务器端口号来访问html网页
查看>>
hdu 6435 CSGO(最大曼哈顿距离)
查看>>
logback框架之——日志分割所带来的潜在问题
查看>>
链路追踪工具之Zipkin学习小记
查看>>
iOS中通讯录的开发
查看>>
怎么让table中的<td>内容向上对齐
查看>>
[Java] 遍历HashMap和HashMap转换成List的两种方式
查看>>