Go語(yǔ)言高并發(fā)實(shí)戰(zhàn):構(gòu)建千萬(wàn)級(jí)在線的實(shí)時(shí)消息推送服務(wù)_第1頁(yè)
Go語(yǔ)言高并發(fā)實(shí)戰(zhàn):構(gòu)建千萬(wàn)級(jí)在線的實(shí)時(shí)消息推送服務(wù)_第2頁(yè)
Go語(yǔ)言高并發(fā)實(shí)戰(zhàn):構(gòu)建千萬(wàn)級(jí)在線的實(shí)時(shí)消息推送服務(wù)_第3頁(yè)
Go語(yǔ)言高并發(fā)實(shí)戰(zhàn):構(gòu)建千萬(wàn)級(jí)在線的實(shí)時(shí)消息推送服務(wù)_第4頁(yè)
Go語(yǔ)言高并發(fā)實(shí)戰(zhàn):構(gòu)建千萬(wàn)級(jí)在線的實(shí)時(shí)消息推送服務(wù)_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Go 語(yǔ)言高并發(fā)實(shí)戰(zhàn)構(gòu)建千萬(wàn)級(jí)在線的實(shí)時(shí)消息推送服務(wù)2012.12.12關(guān)于我 張景埕,網(wǎng)名 diogin(/dadrn/) programmer360 Go 語(yǔ)言追隨者與實(shí)踐者 新浪微博:http:/ 摘要 一、為什么選用 Go 二、探究 Go 語(yǔ)言的實(shí)現(xiàn)細(xì)節(jié) 三、實(shí)時(shí)消息推送服務(wù)的特點(diǎn) 四、系統(tǒng)架構(gòu)及組件細(xì)節(jié) 五、數(shù)據(jù)、經(jīng)驗(yàn)和教訓(xùn)一、為什么選用 Go1. 高并發(fā) 一個(gè) Go 進(jìn)程可以輕易支撐幾十萬(wàn)上百萬(wàn)并發(fā)運(yùn)行的 Go 例程(只要你內(nèi)存足夠大) O(1) 的調(diào)度 5KiB/goroutine 的內(nèi)存開(kāi)銷 net 包:pollServer (epoll/kqueue/iocp) 支持大量并發(fā)

2、連接 fd 的事件通知,同時(shí)還支持多核并行 (目前為 8 核) select/channel 提供卓越的例程間通信能力2. 高性能 編譯為本地機(jī)器碼 靜態(tài)鏈接 (CGO_ENABLED=0) 輕量級(jí)的 runtime 實(shí)現(xiàn) 熱點(diǎn)代碼可以直接編寫 C 或 ASM,同樣靜態(tài)鏈接進(jìn)目標(biāo)文件3. 垃圾收集 不想為內(nèi)存泄露問(wèn)題焦頭爛額 樸素的實(shí)現(xiàn):停頓式、標(biāo)記 & 清除 還有很大的提升空間 資源泄露還得自己解決4. 低成本 學(xué)習(xí)成本低:源自 C 系,大量的 C 系程序員可以很快上手(這很重要) 運(yùn)維成本低:不需要安裝各種讓人頭疼的依賴,不需要搭建各種運(yùn)行環(huán)境,部署非常方便5. 夠用的標(biāo)準(zhǔn)庫(kù) net en

3、coding/gob strings, bytes, errors, strconv regexp os, time syscall sync .6. 高移植性 多種操作系統(tǒng):Linux, FreeBSD, Darwin, NetBSD, OpenBSD, Windows 多種體系結(jié)構(gòu):386, amd64, arm(v5,v6,v7) 多種目標(biāo)文件格式:elf/pe/macho7. 優(yōu)秀的背景 Google, BSD License Ken Thompson, Rob Pike, Robert Griesemer, Russ Cox, Brad Fitzpatrick. 擁有強(qiáng)烈的 Plan

4、 9 血統(tǒng) C, Python 的風(fēng)格Alternatives? Erlang Node.js D Rust二、探究 Go 語(yǔ)言的實(shí)現(xiàn)細(xì)節(jié)WHY? 產(chǎn)品級(jí)的應(yīng)用,不是玩具 在國(guó)內(nèi)(甚至國(guó)外),仍處于吃螃蟹階段 我們需要能 hold 住可能出現(xiàn)的各種問(wèn)題 提升團(tuán)隊(duì)成員技術(shù)水平 回饋 Go 本身,積極為其做貢獻(xiàn)摘要 代碼結(jié)構(gòu) 邏輯結(jié)構(gòu) 實(shí)現(xiàn)結(jié)構(gòu) 程序啟動(dòng) 運(yùn)行視角 深入 runtime1. 代碼結(jié)構(gòu) 工具 + 標(biāo)準(zhǔn)庫(kù) include/:Go 基本工具依賴的庫(kù)的頭文件 src/:Go 基本工具、標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn) src/cmd/:Go 基本工具及其實(shí)現(xiàn) src/lib*/:Go 基本工具依賴的庫(kù)的實(shí)現(xiàn)

5、src/pkg/:Go 標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)2. 邏輯結(jié)構(gòu) gc (Go 編譯器)、cc (Plan 9 C 編譯器)、as (Plan 9 匯編器)、ld (Plan 9 鏈接器)、pack (Plan 9 目標(biāo)文件歸檔工具) 工具鏈一條龍 支持多種操作系統(tǒng)、體系結(jié)構(gòu)和可執(zhí)行文件格式 程序 = N 個(gè)包的合并、組合 包 = const、var、type、func dist:引導(dǎo)程序,負(fù)責(zé)構(gòu)建 Go 基本工具 go:管理 Go 的各項(xiàng)功能3. 實(shí)現(xiàn)結(jié)構(gòu) 每個(gè)包里可以有 .go、.c、.s 文件,分別由 gc、cc、as 編譯,最后統(tǒng)一用 ld/pack 鏈接并打包成靜態(tài)鏈接庫(kù)(遵循一致的 ABI) 每

6、個(gè) Go 程序都包含最底層的 runtime 包,runtime 實(shí)現(xiàn)并封裝了程序的運(yùn)行時(shí)環(huán)境 syscall 包封裝了操作系統(tǒng)調(diào)用,同時(shí)與 runtime 協(xié)作進(jìn)行 goroutine 調(diào)度 sync 提供了基本的并發(fā)同步原語(yǔ)(工具包) reflect 為應(yīng)用層代碼提供運(yùn)行時(shí)自省能力4. 程序啟動(dòng) 基本概念:M內(nèi)核線程,Ggoroutine Go 使用符號(hào)“”分隔包與包內(nèi)的成員名字 準(zhǔn)備 runtimem0/runtimeg0 - 準(zhǔn)備 argc, argv - 調(diào)度器初始化(內(nèi)存初始化 - m 初始化 - 注冊(cè) args, envs - 設(shè)置并行參數(shù)) - 創(chuàng)建并運(yùn)行 runtimemai

7、n 例程(啟動(dòng)垃圾收集器 - maininit() - mainmain()5. 運(yùn)行視角 程序由多個(gè)包構(gòu)成,入口為 main 包,每個(gè)包在程序啟動(dòng)時(shí)按依賴順序逐一初始化 程序內(nèi)有多個(gè) goroutine 并發(fā)運(yùn)行,goroutine 通過(guò) channel 進(jìn)行同步/異步通信 自動(dòng)化內(nèi)存管理,不區(qū)分堆和棧6. 深入 runtime mgc0.c:垃圾收集器 proc.c:goroutine 管理及調(diào)度 hashmap.c:Go map chan.c:channel 實(shí)現(xiàn) malloc.goc:內(nèi)存分配器 asm_GOARCH.s:體系結(jié)構(gòu)相關(guān)功能 iface.c:Go interface sy

8、mtab.c:符號(hào)表 cpuprof.c/mprof.goc:Profiling sys_GOOS.s:操作系統(tǒng)相關(guān)功能 thread_GOOS:內(nèi)核線程統(tǒng)一抽象 panic:panic管理三、實(shí)時(shí)消息推送服務(wù)的特點(diǎn)摘要 長(zhǎng)連接(多種接入?yún)f(xié)議:HTTP、TCP) 高并發(fā)(= 10,000,000) 多種發(fā)送方式(支持單播、多播、廣播) 持久/非持久 準(zhǔn)實(shí)時(shí)(200ms 2s) 客戶端多樣性(手機(jī)端、PC 端) 同一賬號(hào)多客戶端同時(shí)接入 接入網(wǎng)絡(luò)頻繁變化(電信、聯(lián)通)1. 長(zhǎng)連接 Server PUSH 的基礎(chǔ) HTTP Long Polling(Keep-Alive) 基于 TCP 的自定義通

9、信協(xié)議 采用心跳來(lái)偵測(cè)對(duì)方是否還在線2. 高并發(fā) C10K? out 了,現(xiàn)在的標(biāo)準(zhǔn)是 C1000K 用戶眾多:各接入產(chǎn)品實(shí)時(shí)在線人數(shù)都在10,000,000 以上 Linux Kernel = 2.6.32, x86-64 sysctl -w fs.file-max=12000000 sysctl -w fs.nr_open=11000000 limit.conf: nofile=10000000 TCP/IP 協(xié)議棧參數(shù)調(diào)優(yōu)3. 多種發(fā)送方式 點(diǎn)對(duì)點(diǎn)聊天(單播) 定點(diǎn)推送(多播) 全網(wǎng)推送(廣播)4. 持久/非持久 持久消息必須保證不丟失 (需要離線存儲(chǔ)) 非持久消息僅發(fā)給當(dāng)前在線用戶5.

10、 準(zhǔn)實(shí)時(shí) 發(fā)一條消息,另一個(gè)人必須能很快收到 200ms 2s GC 卡頓會(huì)造成巨大麻煩6. 客戶端多樣性 手機(jī)、PC、平板電腦 不同的產(chǎn)品有不同的需求 提供機(jī)制,而非策略7. 同一賬號(hào)多客戶端接入 iMessage:iPhone, iPad, MacOSX QQ:PC、手機(jī)、平板、微信 互斥(早期 QQ)& 共存 策略:如何控制?8. 接入網(wǎng)絡(luò)頻繁變化 白天在電信,晚上在聯(lián)通 一會(huì)兒在公司 wifi,一會(huì)兒 3G,一會(huì)兒 2G 斷線,重連,斷線,重連四、系統(tǒng)架構(gòu)及實(shí)現(xiàn)細(xì)節(jié)摘要 邏輯架構(gòu):簡(jiǎn)單至上 組件:room 組件:register 組件:saver 組件:idgenerator 組件:c

11、enter 存儲(chǔ):redis1. 邏輯架構(gòu):簡(jiǎn)單至上2. 組件:room 客戶端所連接的進(jìn)程,類似于一個(gè)聊天室 每個(gè)客戶端一個(gè) server goroutine 進(jìn)行下推 每個(gè) server 有一個(gè) channel 存消息隊(duì)列 room 內(nèi)有 book 記錄 user 與 server 映射 一個(gè) http server 負(fù)責(zé)收消息并將消息路由到接收人所在的 room 和 server manager 負(fù)責(zé)掌控 room 的服務(wù):內(nèi)部單播、多播、廣播 admin 負(fù)責(zé) room 進(jìn)程的管理3. 組件:register 由于 room 的分布式與全對(duì)稱設(shè)計(jì),需要有一個(gè)地方記錄用戶當(dāng)前連到了哪個(gè)

12、room,register 實(shí)現(xiàn)該角色 同時(shí)需要記錄在線時(shí)長(zhǎng)等信息 (業(yè)務(wù)需求) 本質(zhì)上就是一個(gè) key - value 的 map value 是個(gè) struct hash 算法定位 register 進(jìn)程 可以直接用 redis,但自己實(shí)現(xiàn)可以方便地添加業(yè)務(wù)邏輯4. 組件:saver 分布式全對(duì)稱設(shè)計(jì) 提供存儲(chǔ)接口,封裝后端的分布式存儲(chǔ) 接口采用 encoding/gob 編碼格式的 rpc5. 組件:idgenerator 全局消息 id 生成器,int64 分布式,每個(gè)進(jìn)程負(fù)責(zé)一塊 id 區(qū)域 保證不重疊 后臺(tái) goroutine 每隔一秒寫一次磁盤,記錄當(dāng)前 id 啟動(dòng)時(shí)跳過(guò)一段 i

13、d,防止一秒內(nèi)未寫入磁盤的 id 重復(fù)生成6. 組件:center 提供消息操縱接口給應(yīng)用服務(wù)器調(diào)用 運(yùn)營(yíng)人員后臺(tái)發(fā)消息 - 應(yīng)用服務(wù)器 - center - room - 客戶端 RESTful API 有些任務(wù)(比如廣播)需要一段時(shí)間,運(yùn)營(yíng)人員需要追蹤發(fā)送進(jìn)度,可能要臨時(shí)停止,因此需要有“任務(wù)”概念,并可管理 提供統(tǒng)計(jì)接口7. 存儲(chǔ):redis 核心數(shù)據(jù) db_users:ZSET,存各產(chǎn)品的用戶集合 db_slots:LIST,存用戶離線消息隊(duì)列 db_buckets:DICT,存消息 id - 消息體五、數(shù)據(jù)、經(jīng)驗(yàn)和教訓(xùn)數(shù)據(jù) 16臺(tái)機(jī)器,標(biāo)配24個(gè)硬件線程,64GB內(nèi)存 Linux Kernel 2.6.32 x86_64 單機(jī)80萬(wàn)并發(fā)連接,load 0.20.4,CPU 總使用率 7%10%,內(nèi)存占用20GB (res) 目前接入的產(chǎn)品約1280萬(wàn)在線用戶 2分鐘一次GC,停頓2秒 (1.0.3 的 GC 不給力,直接升級(jí)到 tip

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論