GitHub如何在Redis中使用分片的複製速率限制器擴充套件API
大約一年前,我們GitHub遷移了一箇舊的速率限制器,以提供更多的流量並適應更具彈性的平臺體系結構。我們採用了帶有客戶端分片的複製Redis後端。最終,效果很好,但是我們在此過程中吸取了一些教訓。
Memcached問題
我們以前有一個很簡單的舊速率限制器:
- 對於每個請求,確定當前速率限制的“key”
- 在Memcached中,遞增該key的值,如果沒有任何當前值,則將其設定為1
- 另外,如果還沒有,請使用相關的key(例如“ #{key}:reset_at”)在Memcached中設定“reset at”值
- 遞增時,如果“ reset at”值是過去的值,則忽略現有值並設定一個新的“ reset at”
- 在每個請求的開始,如果key的值大於限制,並且“reset at”是未來的值,則拒絕該請求
(可能會有更多細微差別,但這是主要思想。)
但是,此限制器有兩個問題:
- 我們的Memcached架構是由於更改而來的。由於它主要用作快取層,因此我們將從一個共享Memcached切換到每個資料中心的單個Memcached。儘管對於應用程式快取來說這很好用,但是如果將客戶端請求路由到不同的資料中心,它將使我們的速率限制器的行為非常奇怪。
- Memcached的“永續性”不適用於我們。Memcached後端由速率限制器和其他應用程式快取共享,這意味著,當記憶體被填滿時,即使它仍處於活動狀態,有時也會刪除速率限制器資料。
Redis
經過一番討論,我們決定為速率限制器設計一種新的設計:
- 使用Redis,因為它具有更合適的永續性系統以及簡單的分片和複製設定
- 在應用程式內部分片:應用程式將為每個鍵選擇要從中讀取和寫入的Redis叢集
- 為了減輕Redis的CPU約束性,請在每個群集中放置一個主資料庫(用於寫入)和幾個副本(用於讀取)
- 與其在資料庫中編寫“ reset at”(重置為),不如使用Redis過期功能使值在不再適用時消失
- 在Lua中實現儲存邏輯,以確保操作的原子性(這是對先前設計的改進)
我們從兩個出色的現有資源中汲取靈感:
- Redis自己的文件,其中包括一些速率限制器模式
- Stripe的技術部落格文章“使用Rate Limiters擴充套件API ”,其中包括Ruby和Redis示例實現
解決了各種問題之後,新的速率限制器效果很好。它提高了可靠性,為客戶解決了固定問題,並減少了我們的支援負載。
詳細原文點選標題。
相關文章
- Laravel API 速率限制器的使用LaravelAPI
- 使用aggregation API擴充套件你的kubernetes APIAPI套件
- GitHub - RakeshBhat/rbsample-sprng_camelthrottle:結合SpringBoot和ApacheCamel的REST API速率限制器GithubSpring BootApacheRESTAPI
- 如何擴充套件Kubernetes API?套件API
- 如何在 Linux 中擴充套件 XFS 根分割槽Linux套件
- C 擴充套件庫 – mysql API套件MySqlAPI
- Homestead 安裝 Redis 擴充套件Redis套件
- php8.2 redis擴充套件PHPRedis套件
- PHP安裝redis擴充套件PHPRedis套件
- springmvc redis @Cacheable擴充套件(一)SpringMVCRedis套件
- Redis 實戰 —— 13. 擴充套件 RedisRedis套件
- MAC XAMPP 整合使用Redis 及 安裝php redis擴充套件MacRedisPHP套件
- MySQL 複製 - 效能與擴充套件性的基石:概述及其原理MySql套件
- MySQL 複製 - 效能與擴充套件性的基石 2:部署及其配置MySql套件
- laradock 中安裝 Redis 擴充套件的正確姿勢Redis套件
- 【擴充套件分享】多多客 API SDK套件API
- [擴充套件分享] 多多客 API SDK套件API
- 在 easywechat 包上擴充套件 API 介面套件API
- 使用Kotlin擴充套件函式擴充套件Spring Data案例Kotlin套件函式Spring
- (16) SpringCloud-Eureka的REST API及API擴充套件SpringGCCloudRESTAPI套件
- php安裝redis擴充套件及操作redisPHPRedis套件
- PHP 操作 Redis 之 phpredis 擴充套件PHPRedis套件
- laragon 新增 PHP_Redis 擴充套件GoPHPRedis套件
- Homestead 安裝 PHP Redis 擴充套件PHPRedis套件
- docker PHP 安裝 Redis 擴充套件DockerPHPRedis套件
- Laragon新增PHP_Redis擴充套件GoPHPRedis套件
- MySQL 複製 - 效能與擴充套件性的基石 4:主備切換MySql套件
- 使用Kotlin + Jersey + Jetty + MongoDB建立可擴充套件的RESTful API - AndrewKotlinJettyMongoDB套件RESTAPI
- 學習PHP中YAML操作擴充套件的使用PHPYAML套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- Solon詳解(六)- Solon的校驗擴充套件框架使用與擴充套件套件框架
- shell中擴充套件命令套件
- Git和Github的最佳VS Code外掛擴充套件Github套件
- 重構 - 設計API的擴充套件機制API套件
- 手把手教你配置php的redis擴充套件PHPRedis套件
- sql中的擴充套件學習SQL套件
- 如何在呼叫Marketing Cloud contact建立API時增加對擴充套件欄位的支援CloudAPI套件
- 如何在高度可擴充套件的系統中管理後設資料套件