Guava RateLimiter限流

爲何有這篇文章
在負責某個項目開發過程當中,在定時任務(job)裏面調用了公司的內部某個微服務,進行財務流水生成,在被調用方能力處理不及時的時候,引起被調用方宕機奔潰,故此在客戶端,即Job作簡單的限流,因而針對此場景進行調研,發現Guava RateLimiter在此種場景下,簡單且高效。
模擬調用示例
public static void main(String[] args) {
        // 模擬10次調用
        int a = 10;
        while (true) {
            // 調用的當前時間
            LocalTime now = LocalTime.now();
            System.out.println("模擬調用三方微服務,當前時間爲:" + now.toString());
            a--;
            if (a == 0) {
                break;
            }
        }
    }
模擬調用三方微服務,當前時間爲:10:16:22.088
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
由本示例能夠了解到,在 10:16:22 內完成了 10次調用,本次調用過程當中對於調用方的併發處理能力要求很高,若是調用方沒有作限流等操做的話,在業務高峯期,調用方很容易崩潰,固然咱們若是做爲調用方的話,也須要作簡單的限流操做:推薦使用 sentine https://sentinelguard.io/zh-cn/docs/open-source-framework-integrations.html
客戶端調用按照RateLimiter限流限流示例
public static void main(String[] args) {
        //初始化 每秒1個令牌
        RateLimiter rateLimiter = RateLimiter.create(1);
        int a = 10;
        while (true) {
            //每次須要1個令牌
            rateLimiter.acquire(1);
            LocalTime now = LocalTime.now();
            System.out.println("模擬調用三方微服務,當前時間爲:" + now.toString());
            a--;
            if (a == 0) {
                break;
            }
        }
    }
模擬調用三方微服務,當前時間爲:10:24:10.257
模擬調用三方微服務,當前時間爲:10:24:11.176
模擬調用三方微服務,當前時間爲:10:24:12.177
模擬調用三方微服務,當前時間爲:10:24:13.177
模擬調用三方微服務,當前時間爲:10:24:14.180
模擬調用三方微服務,當前時間爲:10:24:15.180
模擬調用三方微服務,當前時間爲:10:24:16.175
模擬調用三方微服務,當前時間爲:10:24:17.180
模擬調用三方微服務,當前時間爲:10:24:18.179
模擬調用三方微服務,當前時間爲:10:24:19.177
咱們能夠看到限流後的服務調用記錄,在10-19秒內,每秒調用一次,服務調用平穩,並沒有瞬時的高峯,緩解了調用方的服務壓力,不會平白無故背鍋。
RateLimiter源碼分析
持續更新中....
相關文章
相關標籤/搜索