Go 開(kāi)源說(shuō)第十八期預(yù)告:基于 Reactor 模式開(kāi)發(fā)網(wǎng)絡(luò)服務(wù)——gnet
點(diǎn)擊藍(lán)字
關(guān)注我們
潘建鋒
?https://github.com/panjf2000

公司、職位:
騰訊游戲,后端高級(jí)工程師
嘉賓簡(jiǎn)介:
Go 協(xié)程池 ants 和高性能 Go 網(wǎng)絡(luò)庫(kù) gnet 作者,Golang、redis、istio、fasthttp、gin 等知名開(kāi)源項(xiàng)目的活躍貢獻(xiàn)者,專注于系統(tǒng)底層原理、高性能網(wǎng)絡(luò)編程、架構(gòu)設(shè)計(jì)、云原生、分布式。
Go 語(yǔ)言基于 goroutine 和 GPM 調(diào)度器構(gòu)建了一個(gè)簡(jiǎn)潔而優(yōu)秀的原生網(wǎng)絡(luò)模型,讓開(kāi)發(fā)者能夠用同步的模式去編寫異步的邏輯:goroutine-per-connection 模式,極大地降低了開(kāi)發(fā)者編寫網(wǎng)絡(luò)應(yīng)用時(shí)的心智負(fù)擔(dān),而且借助于 Go Scheduler 對(duì) goroutines 的高效調(diào)度,這個(gè)原生網(wǎng)絡(luò)模型足以應(yīng)對(duì)絕大部分的應(yīng)用場(chǎng)景。
基于同步編程模式的原生 Go 網(wǎng)絡(luò)庫(kù)能夠滿足大部分網(wǎng)絡(luò)后臺(tái)系統(tǒng)的開(kāi)發(fā),且可以有良好的性能。但是,對(duì)于某些追求極致性能的場(chǎng)景,如海量連接,原生庫(kù)會(huì)引入龐大的 goroutines 數(shù)量,消耗大量的資源,從而影響性能表現(xiàn),Go 原生網(wǎng)絡(luò)庫(kù)在這一類場(chǎng)景下會(huì)變得力不從心,在不考慮更換編程語(yǔ)言的前提下,基于 Reactor 模式開(kāi)發(fā)網(wǎng)絡(luò)服務(wù)是主流的解決方案,gnet 正是為此而生。
核心亮點(diǎn):
高性能:極高的網(wǎng)絡(luò)通信性能、極低的系統(tǒng)資源損耗;輕量級(jí):API 精簡(jiǎn)專注,不引入過(guò)度復(fù)雜且不實(shí)用的特性,保證框架的易用性。
功能特性:
高性能 的基于多線程/Go程網(wǎng)絡(luò)模型的 event-loop 事件驅(qū)動(dòng)
內(nèi)置 goroutine 池,由開(kāi)源庫(kù) ants 提供支持
內(nèi)置 bytes 內(nèi)存池,由開(kāi)源庫(kù) bytebufferpool 提供支持
整個(gè)生命周期是無(wú)鎖的
簡(jiǎn)單易用的 APIs
高效、可重用而且自動(dòng)伸縮的環(huán)形內(nèi)存 buffer
支持多種網(wǎng)絡(luò)協(xié)議/IPC 機(jī)制:TCP、UDP 和 Unix Domain Socket
支持多種負(fù)載均衡算法:Round-Robin(輪詢)、Source-Addr-Hash(源地址哈希) 和 Least-Connections(最少連接數(shù))
支持兩種事件驅(qū)動(dòng)機(jī)制:Linux 里的 epoll 以及 FreeBSD/DragonFly/Darwin 里的 kqueue
支持異步寫操作
靈活的事件定時(shí)器
SO_REUSEPORT 端口重用
內(nèi)置多種編解碼器,支持對(duì) TCP 數(shù)據(jù)流分包:LineBasedFrameCodec, DelimiterBasedFrameCodec, FixedLengthFrameCodec 和 LengthFieldBasedFrameCodec,參考自 netty codec,而且支持自定制編解碼器
實(shí)現(xiàn) gnet 客戶端(測(cè)試中)
發(fā)展?fàn)顩r:
目前 gnet 是性能最高的第三方 Go 語(yǔ)言開(kāi)源網(wǎng)絡(luò)庫(kù),且應(yīng)用廣泛,目前已經(jīng)在騰訊、騰訊游戲、愛(ài)奇藝、百度、小米等大型互聯(lián)網(wǎng)公司的生產(chǎn)環(huán)境上部署運(yùn)行,經(jīng)過(guò)大廠們的線上流量考驗(yàn),gnet 在穩(wěn)定性方面是有保障的,可以放心試用。
GMP 調(diào)度器精要
講解 Go 的 GMP 調(diào)度器的基本運(yùn)行原理,使讀者對(duì) Go 語(yǔ)言的并發(fā)調(diào)度有一個(gè)整體且較為準(zhǔn)確的理解。
Go 網(wǎng)絡(luò)并發(fā)模型
進(jìn)一步講解 Go 語(yǔ)言的網(wǎng)絡(luò)并發(fā)模型,理解基于 Go 構(gòu)建的網(wǎng)絡(luò)服務(wù)在底層是如何運(yùn)轉(zhuǎn)的。
優(yōu)化 Go 網(wǎng)絡(luò)開(kāi)發(fā)
講解 gnet 是如何直接基于多路復(fù)用技術(shù)提升網(wǎng)絡(luò)通信性能的,以及 gnet 在 Go 原生網(wǎng)絡(luò)庫(kù)之外的定位的目標(biāo)。





