Web API 速率限制(一)
導讀
當您API有大量消費者或者請求量猛增到影響程序可用性的時候,您可能需要對API進行速率限制。所以對API進行限速的在于:在增加可靠性和可用性的同時來保護基礎架構,你不希望某個惡意的API消費者或者差勁的API客戶端開發者通過Dos攻擊把你的應用搞垮;保護你的產品,你同樣不希望你的產品被濫用,例如大規模用戶注冊或創建很多垃圾內容。
什么是限速
限速(Rate-Limiting)系統可以控制網絡接口發送和接受流量的速率。對于Web API來說,限速系統被用來控制一段時間內某個程序或客戶端允許調用某個API的次數,超過該次數的流量會被拒絕。例如Github的API只允許開發者每小時發送5000次請求。
限速
策略
在對API限速之前,您首先要考慮好限速的策略,通常一個好的限速策略有以下這兩個特性:
易于理解,易于解釋,易于使用
針對特殊情況,對開發者可以不限速
限速策略需考慮這些
限速策略還需要考慮這些問題:
顆粒速率限制還是全局速率限制
針對比較簡單的系統,很多開發者采用的是全局速率限制,但是如果某個API消費了大量的資源,你可能需要為每個API單獨進行速率限制。所以顆粒的速率限制會保護你的基礎架構不被任何耗資巨大的API節點所引起的無理流量尖峰造成嚴重影響。
測量每個用戶、應用、客戶端
你想要進行速率限制的資源還依賴于您的API的身份認證方式。需要用戶身份認證的API通常可以按照用戶進行速率限制,而需要應用身份認證的API通常是基于每個應用來進行速率限制。對于未認證的API,我能想到的就是按照IP地址進行速率限制。
是否支持突發流量
有些API,尤其是企業內部的系統,需要支持超過速率限制的突發流量。這種情況下,可以采用令牌桶算法(Token Bucket)來實現速率限制。
是否允許例外
有時候,對于應用的開發者來說,一個限速策略或一組限速策略可能都不太適用。對于你信任的開發者,如果他們的請求超出了配額,可能需要給他們一些例外的允許,但是在此之前,你要做這些工作:
保證每個開發者的用例對客戶來說都是合理有益的。
要確認確實沒有其它不超出約束的辦法來達到相同的目的。
確保你的基礎架構確實可以支撐想要請求的速率。
針對 ASP.NET Core Web API
針對ASP.NET Core Web API項目,如果不采用網關的話,我使用的是:
AspNetCoreRateLimit。
Github的地址是:
https://github.com/stefanprodan/AspNetCoreRateLimit。
這個我會在后續文章中介紹。
針對API網關
.NET Core的Ocelot網關內置速率限制功能。
https://ocelot.readthedocs.io/en/latest/features/ratelimiting.html
而其它正經的API網關也都有該功能,例如Kong等。Kong的官網有一篇介紹API速率限制算法的文章,講的很好可以看看:
https://konghq.com/blog/how-to-design-a-scalable-rate-limiting-algorithm/
我也會在下一篇文章中介紹API速率限制的幾種算法。
且聽下回分解
2019-05-19
.NET Core Rocks!!! \m/
總結
以上是生活随笔為你收集整理的Web API 速率限制(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [NewLife.XCode]百亿级性能
- 下一篇: 构建简单的微服务架构