https://mp.weixin.qq.com/s/wSaJYg-HqnYY4SdLA2Zzaw
RPC 框架作為研發體系中重要的一環,承載了幾乎所有的服務流量。本文將簡單介紹字節跳動自研網絡庫 netpoll 的設計及實踐;以及我們實際遇到的問題和解決思路,希望能為大家提供一些參考。
前言
字節跳動框架組主要負責公司內 RPC 框架的開發與維護。RPC 框架作為研發體系中重要的一環,承載了幾乎所有的服務流量。隨着公司內 Go 語言使用越來越廣,業務對框架的要求越來越高,而 Go 原生 net 網絡庫卻無法提供足夠的性能和控制力,如無法感知連接狀態、連接數量多導致利用率低、無法控制協程數量等。為了能夠獲取對於網絡層的完全控制權,同時先於業務做一些探索並最終賦能業務,框架組推出了全新的基於 epoll 的自研網絡庫 —— netpoll,並基於其之上開發了字節內新一代 Golang 框架 KiteX。
由於 epoll 原理已有較多文章描述,本文將僅簡單介紹 netpoll 的設計;隨后,我們會嘗試梳理一下我們基於 netpoll 所做的一些實踐;最后,我們將分享一個我們遇到的問題,以及我們解決的思路。同時,歡迎對於 Go 語言以及框架感興趣的同學加入我們!
新型網絡庫設計
Reactor - 事件監聽和調度核心
netpoll 核心是 Reactor 事件監聽調度器,主要功能為使用 epoll 監聽連接的文件描述符(fd),通過回調機制觸發連接上的 讀、寫、關閉 三種事件。