基於redis+lua實現高並發場景下的秒殺限流解決方案


轉自: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的長度數據,如圖所示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM