2 回答

TA貢獻1784條經驗 獲得超9個贊
僅當有足夠的流控制窗口時消息才會成功發送,否則 SendMsg() 將阻塞。
接收端發出的信號不是增加反壓,而是釋放反壓。這就像說“現在我準備好接收另外 1MB 的消息,發送它們”。

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考慮增加連接和流窗口大小。
連接窗口大小應始終等于或大于流窗口大小。流是連接的一部分,發送者受到兩者的限制。
- 2 回答
- 0 關注
- 197 瀏覽
添加回答
舉報