Kitex 限流

2022-04-26 15:28 更新

限流

限流是一種保護 server 的措施,防止上游某個 client 流量突增導(dǎo)致 server 端過載。

目前 Kitex 支持限制最大連接數(shù)和最大 QPS,在初始化 server 的時候,增加一個 Option,舉例:

import "github.com/cloudwego/kitex/pkg/limit"

func main() {
  svr := xxxservice.NewServer(handler, server.WithLimit(&limit.Option{MaxConnections: 10000, MaxQPS: 1000}))
    svr.Run()
}

參數(shù)說明:

  • MaxConnections 表示最大連接數(shù)
  • MaxQPS 表示最大 QPS
  • UpdateControl 提供動態(tài)修改限流閾值的能力,舉例:

import "github.com/cloudwego/kitex/pkg/limit"

// define your limiter updater to update limit threshold
type MyLimiterUpdater struct {
  updater limit.Updater
}

func (lu *MyLimiterUpdater) YourChange() {
  // your logic: set new option as needed
  newOpt := &limit.Option{
    MaxConnections: 20000,
    MaxQPS:         2000,
  }
  // update limit config
  isUpdated := lu.updater.UpdateLimit(newOpt)
  // your logic
}

func (lu *MyLimiterUpdater) UpdateControl(u limit.Updater) {
  lu.updater = u
}

//--- init server ---
var lu  = MyLimiterUpdater{}
svr := xxxservice.NewServer(handler, server.WithLimit(&limit.Option{MaxConnections: 10000, MaxQPS: 1000, UpdateControl: lu.UpdateControl}))

實現(xiàn)

分別使用 ConcurrencyLimiter 和 RateLimiter 對最大連接數(shù)和最大 QPS 進行限流。

  • ConcurrencyLimiter:簡單的計數(shù)器;
  • RateLimiter:這里的限流算法采用了 " 令牌桶算法 “。

監(jiān)控

限流定義了 ?LimitReporter ?接口,用于限流狀態(tài)監(jiān)控,例如當前連接數(shù)過多、QPS 過大等。

如有需求,用戶需要自行實現(xiàn)該接口,并通過 ?WithLimitReporter ?注入。

// LimitReporter is the interface define to report(metric or print log) when limit happen
type LimitReporter interface {
    ConnOverloadReport()
    QPSOverloadReport()
}


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號