釋出個 golang 高效能非同步網路框架 nbio,單機百萬不是夢!

lesismal發表於2021-02-24

專案地址

關於另一個框架

  • https://github.com/lesismal/arpc

  • arpc 包括但不限於 rpc,網路互動模式完善推送、遊戲、IM 等業務也都可以使用。並且 arpcnbio 也打通了,支援使用 nbio 作為網路層實現更大併發量的支援

設計與實現的一些基本思考和細節方案

  1. 跨平臺支援:*nix 用 epoll、kqueue, windows 用的 std/net
  2. epoll LT,單次讀最大可配,避免餓死
  3. epoll 沒有使用 trigger 模式,因為較新版本的核心 epoll 相關係統呼叫以及其他並行流 close 都是安全的,trigger 模式的無鎖對效能提升也是偽命題,額外的系統呼叫以及核心部分的鎖仍然是開銷,應用層有鎖並且單個 Conn 競爭幾乎可以忽略,所以 trigger 模式未必有優勢
  4. Write 是直接寫,寫失敗才掛到 Conn 的佇列,再新增寫事件,可寫、flush 後清理掉寫事件,儘量減少了 epoll/kqueue 的系統呼叫
  5. 支援 writev
  6. 實現了 net.Conn,支援 DeadLine ,併發安全,也方便業務層多個並行流隨意操作
  7. 連線的管理,*nix 直接是 fd 做陣列下標對應 Conn
  8. 讀緩衝、應用層最大寫緩衝都可配
  9. 用於讀取的記憶體分配可由應用層定製,方便業務層做更適合的定製,這個不同場景可以玩很多姿勢,簡單的 pool 未必是最優
  10. Conn 提供 Hash 方法,方便業務層用於訊息分發到指定協程進行處理,從而保證每個連線的訊息處理有序
  11. 單獨的 heap timer,不使用 time.AfterFunc 節約協程
  12. 支援管理標準庫的 net.Conn,比如使用 net.Listener Accept 或者 net.Dial 得到 net.Conn 放到 nbio.Gopher 裡管理讀寫
  13. 最少依賴,除了 tls 作為擴充套件是需要依賴我的另一個倉庫以及 go1.6,單純作為非同步框架,nbio 只依賴標準庫
  14. server-side/client-side 都支援
  • 可定製、擴充套件的挺多的,不一一列舉

與其他一些 golang 非同步網路框架對比

  1. 效能:我這裡同樣配置、引數壓測,nbio qps 基本最高,多個框架的 pprof 分析,nbio 的 syscall read/write 佔比應該是最高的,進入到 syscall 後的部分是框架層沒法再優化的,這說明同一段時間內,nbio 更多的時間是在執行系統呼叫進行讀寫、框架本身的消耗佔比小於其他框架
  2. 易用性:nbio 實現了 net.Conn,更加業務友好、方便擴充套件定製,所以我最近花了幾天把 go 1.6 std 的 crypto/tls copy 了一份,並重寫支援了 nbio 的 tls server-side、server-side,標準哭 tls 的讀寫 buffer 有點浪費,還有不少優化空間,但是暫時夠用、不著急進一步魔改優化。
  • 後續還考慮標準庫的 http 是否也魔改一下支援非同步,但是如果要改,工程量有點大,也是得慢慢搞了

一些例子

1. 使用 nbio 管理標準庫 net.Conn

2. Echo

3. TLS Examples

更多示例請參考文件和程式碼

歡迎關注

  • 歡迎 issue / pr / fork , star 更好
更多原創文章乾貨分享,請關注公眾號
  • 釋出個 golang 高效能非同步網路框架 nbio,單機百萬不是夢!
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章