歡迎光臨
每天分享高質量文章

Web API 速率限制(一)

導讀

 

當您API有大量消費者或者請求量猛增到影響程式可用性的時候,您可能需要對API進行速率限制。所以對API進行限速的在於:在增加可靠性和可用性的同時來保護基礎架構,你不希望某個惡意的API消費者或者差勁的API客戶端開發者透過Dos攻擊把你的應用搞垮;保護你的產品,你同樣不希望你的產品被濫用,例如大規模使用者註冊或建立很多垃圾內容。

什麼是限速

限速(Rate-Limiting)系統可以控制網路介面傳送和接受流量的速率。對於Web API來說,限速系統被用來控制一段時間內某個程式或客戶端允許呼叫某個API的次數,超過該次數的流量會被拒絕。例如Github的API只允許開發者每小時傳送5000次請求。

限速

策略

在對API限速之前,您首先要考慮好限速的策略,通常一個好的限速策略有以下這兩個特性:

  • 易於理解,易於解釋,易於使用

  • 針對特殊情況,對開發者可以不限速

限速策略需考慮這些

 

限速策略還需要考慮這些問題

  1. 顆粒速率限制還是全域性速率限制

    針對比較簡單的系統,很多開發者採用的是全域性速率限制,但是如果某個API消費了大量的資源,你可能需要為每個API單獨進行速率限制。所以顆粒的速率限制會保護你的基礎架構不被任何耗資巨大的API節點所引起的無理流量尖峰造成嚴重影響。

  2. 測量每個使用者、應用、客戶端

    你想要進行速率限制的資源還依賴於您的API的身份認證方式。需要使用者身份認證的API通常可以按照使用者進行速率限制,而需要應用身份認證的API通常是基於每個應用來進行速率限制。對於未認證的API,我能想到的就是按照IP地址進行速率限制。

  3. 是否支援突發流量

    有些API,尤其是企業內部的系統,需要支援超過速率限制的突發流量。這種情況下,可以採用令牌桶演演算法(Token Bucket)來實現速率限制。

  4. 是否允許例外

    有時候,對於應用的開發者來說,一個限速策略或一組限速策略可能都不太適用。對於你信任的開發者,如果他們的請求超出了配額,可能需要給他們一些例外的允許,但是在此之前,你要做這些工作:

    1. 保證每個開發者的用例對客戶來說都是合理有益的。

    2. 要確認確實沒有其它不超出約束的辦法來達到相同的目的。

    3. 確保你的基礎架構確實可以支撐想要請求的速率。

針對 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速率限制演演算法的文章,講的很好可以看看:

How to Design a Scalable Rate Limiting Algorithm

我也會在下一篇文章中介紹API速率限制的幾種演演算法。

且聽下回分解

2019-05-19

.NET Core Rocks!!! \m/


    已同步到看一看
    贊(0)

    分享創造快樂