博客 / 詳情

返回

What’s new in Apache/dubbo-getty 1.5.0

經過半年改進,dubbo-getty 發佈了 v1.5.0 版本,致力於提升穩定性,並修復已知問題,為用户提供更可靠的網絡通信服務。

如昔,依然堅持 "Getty 只考慮使用 Go 語言原生的網絡接口,如果遇到網絡性能瓶頸也只會在自身層面尋找優化突破點" 。

  1. 限制 TCP 客户端重連行為

Getty 支持 TCP lazy reconnect,所謂 lazy reconnect,《Go 語言網絡庫 getty 的那些事》一文有詳細描述。 

圖片

lazy reconnect 整體流程圖如上。

近期社區 No-SilverBullet 筒子覺得:服務端的連接數是動態的,所以我覺得 getty 還是應該有一個兜底的邏輯,而不是 "無腦的" 一直去重連,可以 "添加一個最多重來次數或者重連時間限制":

1 客户端在 read EOF 時,停止重連維護連接池的行為
2 reconnect 增加最大次數,當重連次數超過設定的連接數時,退出

具體改進是:session 增加了新的 attribute(ignoreReconnectKey),用於標識是否重連
最大重連次數設定為用户設定的連接數

相關 PR 是 https://github.com/apache/dubbo-getty/pull/117。

  1. 修復 WebSocket 並行安全問題

Getty WebSocket 通信依賴於 gorilla/websocket 這個包,進行 WebSocket 網絡通信時只能 "支持一個併發 reader 和一個併發 writer"。

Connections support one concurrent reader and one concurrent writer.
Applications are responsible for ensuring that no more than one goroutine calls the write methods (NextWriter, SetWriteDeadline, WriteMessage, WriteJSON, EnableWriteCompression, SetCompressionLevel) concurrently and that no more than one goroutine calls the read methods (NextReader, SetReadDeadline, ReadMessage, ReadJSON, SetPongHandler, SetPingHandler) concurrently.
The Close and WriteControl methods can be called concurrently with all other methods.
-- from https://pkg.go.dev/github.com/gorilla/websocket#hdr-Concurrency

Getty WebSocket 以往沒有注意到這個規則,近期有人在 [issue 120] 中報出了這個 bug,社區筒子立即響應,添加了 gettyWSConn:threadSafeWriteMessage 和 gettyWSConn:threadSafeReadMessage 這兩個接口以解決並行通信的 data race 問題,相關代碼詳見 PR 121 和 PR 123。

相關 PR 是:

https://github.com/apache/dubbo-getty/pull/121

https://github.com/apache/dubbo-getty/pull/123

在 PR 121 中我們順便解決了 [issue 103] 描述的 session 異常關閉問題。

  1. 致謝

感謝所有為 Dubbo-Getty 1.5.0 做出貢獻的社區成員,包括 issue/PR 提交者、代碼 reviewer 以及文章作者【排名不分先後,依據字母序列】:

chenbaoding2818
FoghostCn
Lvnszn
No-SilverBullet
seven-ali
alexstocks/getty 作為 dubbo-getty 的上游倉庫,已在 alexstocks/gettyv1.5.0 中吸收了本次更新。

另外,我們搜到一些第三方作者對 getty 的解析文章,代表社區向這些傳播 getty 的文章作者致敬:

用 golang 實現的 dubbo-getty 是怎麼進行 tcp 通信的?客户端篇 https://mp.weixin.qq.com/s/DYnMwH6-ZCQhVgoRb8pCeQ

用 golang 實現的 dubbo-getty 是怎麼進行 tcp 通信的?服務篇 https://mp.weixin.qq.com/s/vOoXmUxZb9rr1A85qyA7aA

user avatar tfzh 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.