亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

go 中 gRPC 客戶端流控制如何工作?

go 中 gRPC 客戶端流控制如何工作?

Go
狐的傳說 2023-07-10 15:08:12
我想知道 Go 中的客戶端流 gRPC 服務中的流量控制是如何工作的。stream.SendMsg()具體來說,我有興趣知道何時會調用客戶端塊中的函數?根據文檔:SendMsg() 會阻塞,直到:有足夠的流量控制來調度 m 的傳輸,或者......那么流的流控機制規范是怎樣的呢?例如,如果負責從流中讀取消息的服務器端代碼讀取消息的速度不夠快,那么什么時候會調用 SendMsg() 塊?服務器是否實現了某種反壓機制來告訴客戶端它還沒有準備好接收更多數據?與此同時,在反壓信號之前已經成功發送的所有消息都在哪里排隊呢?
查看完整描述

2 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

僅當有足夠的流控制窗口時消息才會成功發送,否則 SendMsg() 將阻塞。

接收端發出的信號不是增加反壓,而是釋放反壓。這就像說“現在我準備好接收另外 1MB 的消息,發送它們”。


查看完整回答
反對 回復 2023-07-10
?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

這是流量控制的另一種解釋

HTTP/2 流量控制是一項防止應用程序被數據淹沒的功能。使用流量控制時:

  • 每個 HTTP/2 連接和請求都有一個可用的緩沖區窗口。緩沖窗口是應用程序一次可以接收多少數據。

  • 如果緩沖區窗口已滿,則流控制將激活。激活后,發送應用程序將暫停發送更多數據。

  • 一旦接收應用程序處理完數據,緩沖區窗口中的空間就可用。發送應用程序恢復發送數據。

接收大消息時,流量控制可能會對性能產生負面影響。如果緩沖區窗口小于傳入消息有效負載,或者客戶端和服務器之間存在延遲,則可以以開始/停止突發的方式發送數據。

流量控制性能問題可以通過增加緩沖區窗口大小來解決。

  • WithInitialWindowSize客戶端:通過撥號選項WithInitialConnWindowSize設置窗口

// WithInitialWindowSize returns a DialOption which sets the value for initial

// window size on a stream. The lower bound for window size is 64K and any value

// smaller than that will be ignored.

func WithInitialWindowSize(s int32) DialOption {

? ? return newFuncDialOption(func(o *dialOptions) {

? ? ? ? o.copts.InitialWindowSize = s

? ? })

}


// WithInitialConnWindowSize returns a DialOption which sets the value for

// initial window size on a connection. The lower bound for window size is 64K

// and any value smaller than that will be ignored.

func WithInitialConnWindowSize(s int32) DialOption {

? ? return newFuncDialOption(func(o *dialOptions) {

? ? ? ? o.copts.InitialConnWindowSize = s

? ? })

}

InitialWindowSize服務器端:通過服務器選項InitialConnWindowSize設置窗口


// InitialWindowSize returns a ServerOption that sets window size for stream.

// The lower bound for window size is 64K and any value smaller than that will be ignored.

func InitialWindowSize(s int32) ServerOption {

? ? return newFuncServerOption(func(o *serverOptions) {

? ? ? ? o.initialWindowSize = s

? ? })

}


// InitialConnWindowSize returns a ServerOption that sets window size for a connection.

// The lower bound for window size is 64K and any value smaller than that will be ignored.

func InitialConnWindowSize(s int32) ServerOption {

? ? return newFuncServerOption(func(o *serverOptions) {

? ? ? ? o.initialConnWindowSize = s

? ? })

}

建議

  • 如果 gRPC 服務經常接收大于 96 KB(Kestrel 的默認流窗口大?。┑南ⅲ瑒t考慮增加連接和流窗口大小。

  • 連接窗口大小應始終等于或大于流窗口大小。流是連接的一部分,發送者受到兩者的限制。


查看完整回答
反對 回復 2023-07-10
  • 2 回答
  • 0 關注
  • 197 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號