Kitex 連接類型

2022-04-26 15:09 更新

連接類型

Kitex 支持短連接、長連接池、連接多路復(fù)用,用戶可以根據(jù)自己的業(yè)務(wù)場景來選擇。>= v0.0.2 默認(rèn)配置了連接池,但建議用戶還是根據(jù)實際情況調(diào)整連接池的大小。

短連接

每次請求都會創(chuàng)建一次連接,性能不佳,通常不建議使用。但部分場景必須使用短連接,如上游實例數(shù)過多時,會增加下游服務(wù)的負(fù)擔(dān),請根據(jù)情況來選擇。

配置短連接:

xxxCli := xxxservice.NewClient("destServiceName", client.WithShortConnection())

長連接池 

Kitex >= v0.0.2 默認(rèn)配置了連接池,配置參數(shù)如下:

connpool2.IdleConfig{
   MaxIdlePerAddress: 10,
   MaxIdleGlobal:     100,
   MaxIdleTimeout:    time.Minute,
}

建議用戶根據(jù)實際情況調(diào)整連接池大小,配置方式如下:

xxxCli := xxxservice.NewClient("destServiceName", client.WithLongConnection(connpool.IdleConfig{10, 1000, time.Minute}))

其中:

  • ?MaxIdlePerAddress ?表示每個后端實例可允許的最大閑置連接數(shù)
  • ?MaxIdleGlobal ?表示全局最大閑置連接數(shù)
  • ?MaxIdleTimeout ?表示連接的閑置時長,超過這個時長的連接會被關(guān)閉(最小值 3s,默認(rèn)值 30s )

實現(xiàn)

長連接池的實現(xiàn)方案是每個 address 對應(yīng)一個連接池,這個連接池是一個由連接構(gòu)成的 ring,ring 的大小為 MaxIdlePerAddress。

當(dāng)選擇好目標(biāo)地址并需要獲取一個連接時,按以下步驟處理 :

  1. 首先嘗試從這個 ring 中獲取,如果獲取失?。]有空閑連接),則發(fā)起新的連接建立請求,即連接數(shù)量可能會超過 MaxIdlePerAddress
  2. 如果從 ring 中獲取成功,則檢查該連接的空閑時間(自上次放入連接池后)是否超過了 MaxIdleTimeout,如果超過則關(guān)閉該連接并新建
  3. 全部成功后返回給上層使用

在連接使用完畢準(zhǔn)備歸還時,按以下步驟依次處理:

  1. 檢查連接是否正常,如果不正常則直接關(guān)閉
  2. 查看空閑連接是否超過全局的 MaxIdleGlobal,如果超過則直接關(guān)閉
  3. 待歸還到的連接池的 ring 中是否還有空閑空間,如果有則直接放入,否則直接關(guān)閉

參數(shù)設(shè)置建議

下面是參數(shù)設(shè)置的一些建議:

  • MaxIdlePerAddress 表示池化的連接數(shù)量,最小為 1,否則長連接會退化為短連接
    • 具體的值與每個目標(biāo)地址的吞吐量有關(guān),近似的估算公式為:MaxIdlePerAddress = qps_per_dest_host*avg_response_time_sec
    • 舉例如下,假設(shè)每個請求的響應(yīng)時間為 100ms,平攤到每個下游地址的請求為 100QPS,該值建議設(shè)置為10,因為每條連接每秒可以處理 10 個請求, 100QPS 則需要 10 個連接進(jìn)行處理
    • 在實際場景中,也需要考慮到流量的波動。需要特別注意的是,即 MaxIdleTimeout 內(nèi)該連接沒有被使用則會被回收
    • 總而言之,該值設(shè)置過大或者過小,都會導(dǎo)致連接復(fù)用率低,長連接退化為短連接
  • MaxIdleGlobal 表示總的空閑連接數(shù)應(yīng)大于 下游目標(biāo)總數(shù)*MaxIdlePerAddress,超出部分是為了限制未能從連接池中獲取連接而主動新建連接的總數(shù)量
    • 注意:該值存在的價值不大,建議設(shè)置為一個較大的值,在后續(xù)版本中考慮廢棄該參數(shù)并提供新的接口
  • MaxIdleTimeout 表示連接空閑時間,由于 server 在 10min 內(nèi)會清理不活躍的連接,因此 client 端也需要及時清理空閑較久的連接,避免使用無效的連接,該值在下游也為 Kitex 時不可超過 10min

連接多路復(fù)用

開啟連接多路復(fù)用,Client 訪問 Server 常規(guī)只需要1個連接即可,相比連接池極限測試吞吐表現(xiàn)更好(目前的極限測試配置了2個連接),且能大大減少連接數(shù)量。

特別說明:

  1. 這里的連接多路復(fù)用是針對于 Thrift 和 Kitex Protobuf,如果配置 gRPC 協(xié)議,默認(rèn)是連接多路復(fù)用。
  2. Client 開啟連接多路復(fù)用,Server 必須也開啟,否則會導(dǎo)致請求超時;Server 開啟連接多路復(fù)用對 Client 沒有限制,可以接受短連接、長連接池、連接多路復(fù)用的請求。

  • Server 配置

option: ?WithMuxTransport ?

svr := xxxservice.NewServer(handler, server.WithMuxTransport())

  • Client 配置 option: ?WithMuxConnection ?

建議配置1-2 個連接

xxxCli := NewClient("destServiceName", client.WithMuxConnection(1))

狀態(tài)監(jiān)控

連接池定義了 ?Reporter ?接口,用于連接池狀態(tài)監(jiān)控,例如長連接的復(fù)用率。

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

// Reporter report status of connection pool.
type Reporter interface {
   ConnSucceed(poolType ConnectionPoolType, serviceName string, addr net.Addr)
   ConnFailed(poolType ConnectionPoolType, serviceName string, addr net.Addr)
   ReuseSucceed(poolType ConnectionPoolType, serviceName string, addr net.Addr)
}

// SetReporter set the common reporter of connection pool, that can only be set once.
func SetReporter(r Reporter)


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號