1. 什么是服務限流野哭?
隨著現(xiàn)在微服務在塔、分布式系統(tǒng)的發(fā)展,各個服務之間的相互調用越來越復雜拨黔。
為了保證自身服務的穩(wěn)定性與高可用糖权,當面對超過自身服務能力的請求調用時碍拆,要做一定的限流措施甘畅。
如同五一搂橙、國慶期間的旅游出行揪利、景區(qū)爆滿态兴,游客限流。我們的服務面對諸如秒殺疟位、大促瞻润、618、雙十一以及可能的惡意攻擊甜刻、爬蟲等高并發(fā)绍撞、大流量的場景也需要做服務限流。
概念:對超出服務處理能力之外的請求進行攔截得院,對訪問服務的流量進行限制傻铣。
2. 常用限流算法
2.1 計數器法(固定窗口)
概念 :在單位時間內,統(tǒng)計進入的請求數量祥绞,統(tǒng)計值達到限流閾值時非洲,開始限流(如拒絕和排隊)。這個單位時間結束后蜕径,計算器清零两踏,重新開始計數。
問題:在固定時間窗口切換處兜喻,最高可能會接收到2倍閾值的流量梦染。
假如設置的時間窗口為5秒,限流閾值為10.
第5秒時進來10個流量朴皆,此時窗口內流量未超閾值帕识。第6秒切換到下一個窗口,此時進來流量10遂铡,當前窗口流量仍未超閾值肮疗。但是 第5秒和第6秒的切換臨界處,短時間內進來了限流閾值的雙倍流量忧便,此時服務可能會因為請求流量過多而發(fā)生異常族吻。
2.2 滑動窗口算法
概念: 滑動窗口對固定窗口進行改良帽借,將其細化,將一個時間窗口劃分為若干個時間窗格超歌,每個窗格代表固定的時間段(如1分鐘)砍艾、擁有獨立的計數器,每過固定時間(如1分鐘)巍举,將滑動窗口向前移動一格脆荷。滑動窗口中的窗格劃分越細懊悯,限流統(tǒng)計越精確蜓谋。
假如設置的時間窗口為5秒,限流閾值為10.
第5秒時進來10個流量炭分,此時窗口內流量未超閾值桃焕。第6秒時進來流量10,與此同時,滑動窗口右移一格捧毛,此時滑動窗口內(第2~6秒)流量為20观堂,大于限流閾值,開始限流呀忧。
2.3 漏斗算法
概念:請求像水一樣注入漏斗师痕,然后以固定的速率流出。漏斗未滿之前而账,請求可以一直進入胰坟;漏斗滿,則請求拒絕泞辐。
漏斗算法可以平滑流量笔横,但是無法解決流量突增的問題。
2.4 令牌桶算法
概念:以恒定速率(令牌產生速率
)向令牌桶中放入令牌铛碑,令牌桶滿(令牌桶大小
)則無法放入狠裹。請求到達后先獲取令牌,拿到令牌后請求被處理并刪除獲得的令牌汽烦。令牌不足時涛菠,請求無法獲得令牌,請求被拒絕撇吞。
令牌桶算法可以平滑限流俗冻,同時可以容忍突發(fā)流量。
3. 限流策略
3.1 服務拒絕
當請求流量達到限流閾值時牍颈,對多余的請求直接拒絕迄薄。
可通過設計實現(xiàn)對指定域名、IP煮岁、客戶端讥蔽、應用涣易、用戶等不同來源的請求進行拒絕。
3.2 延時處理
通過將多余的請求加入緩存隊列或延時隊列冶伞,來應對短期的流量突增新症,高峰期過后開始將堆積的請求流量逐漸處理。
3.3 請求分級(優(yōu)先級)
對不同來源的請求設置優(yōu)先級响禽,先處理優(yōu)先級更高的請求徒爹。如VIP客戶、重要的業(yè)務應用(如交易服務優(yōu)先級高于日志服務)
3.4 動態(tài)限流
可以監(jiān)控系統(tǒng)相關指標芋类、評估系統(tǒng)壓力隆嗅,通過注冊中心、配置中心等動態(tài)調整限流閾值侯繁。
3.5 監(jiān)控預警&動態(tài)擴容
如果有優(yōu)秀的服務監(jiān)控系統(tǒng)與自動部署胖喳、發(fā)布系統(tǒng),可以通過監(jiān)控系統(tǒng)自動監(jiān)測系統(tǒng)運行情況巫击,對短期內服務壓力暴增禀晓、流量大幅寫入的情況進行郵件、短信等方式進行預警坝锰。
在滿足特定條件下,可自動部署重付、發(fā)布相關服務顷级,起到動態(tài)擴容的效果。
4. 限流位置
4.1 接入層限流
可以通過Nginx确垫、API路由網關等對域名或IP進行限流弓颈,同時可以攔截非法請求
4.2 應用限流
每個服務可以有自己的單機或集群限流措施,也可以調用第三方的限流服務
4.3 基礎服務限流
數據庫:限制數據庫連接删掀、限制讀寫速率
消息隊列:限制消費速率(消費量翔冀、消費線程)
如果這篇文章對你有用的話,點個贊再走唄披泪!
如有問題纤子,歡迎留言評論!
歡迎轉載款票,煩請注明出處控硼!