大型分布式C++框架《一:框架简介》
首先名字要取得霸氣才能吸引人氣,哈哈~~
下面簡(jiǎn)單介紹下情況。框架是騰訊電商平臺(tái)的分布式框架。雖然騰訊拍拍已經(jīng)玩完了。但是這套框架還是很不錯(cuò)的。而且據(jù)原騰訊同事說微信也是用的這套框架。源碼肯定是不能說的。但是介紹大體的思想我想應(yīng)該沒問題。雖然在這個(gè)框架下寫了一年多的業(yè)務(wù)代碼。但是平臺(tái)框架的代碼一直沒怎么看。最近有開始看平臺(tái)代碼雖然沒看完。但是大體的思想已經(jīng)清楚。可以分享下我看的心得。具體細(xì)節(jié)我琢磨下看哪些能分享。
現(xiàn)在我們框架依然是用來做電商業(yè)務(wù)。框架可以分布式部署。
簡(jiǎn)單來說是多進(jìn)程+協(xié)程 并沒有用到網(wǎng)上一直說的多線程。
下面來具體介紹下框架的內(nèi)容
一、框架總體介紹
框架總體分4個(gè)部分。config_center、netio2、back_netio2、container3
config_center: 作用是 獲取命令字并通知netio2、back_netio2、container3
netio2: 收取網(wǎng)絡(luò)包 發(fā)給container3 去執(zhí)行
container3:執(zhí)行具體的業(yè)務(wù)
back_netio2:如果是跨機(jī)調(diào)用。則需要back_netio2來轉(zhuǎn)發(fā)包
二、這里我先介紹下一個(gè)包的基本流程。
首先 先簡(jiǎn)單介紹一下我們框架的基本常識(shí)。后面會(huì)詳細(xì)介紹
a)我們是使用的rpc接口遠(yuǎn)程調(diào)用的模式,每個(gè)接口都有一個(gè)命令字。
b)然后 每個(gè)container進(jìn)程就是一個(gè)服務(wù)。每一個(gè)負(fù)責(zé)具體的不同業(yè)務(wù)。 一個(gè)服務(wù)里會(huì)用很多個(gè)接口。
c)每個(gè)服務(wù) 會(huì)分為 ao 和 dao 。 ao做業(yè)務(wù)邏輯。但是是非阻塞的 ,dao 專門用來存取數(shù)據(jù)可以是阻塞的。
接下來我們說下包的流轉(zhuǎn)過程
1) 前端 發(fā)送一個(gè) 調(diào)用接口的請(qǐng)求過來 比如調(diào)用GetShopName接口
2) netio 收到包以后。 做一些處理。比如打上時(shí)間戳等。 然后把包丟到消息隊(duì)列里。 netio是一個(gè)單線程的進(jìn)程。 可以起多個(gè)netio來收包。
3)container服務(wù) 在消息隊(duì)列里發(fā)現(xiàn)有包。 就取出來處理。然后切換協(xié)程。 它會(huì)把包丟給具體的AO業(yè)務(wù)服務(wù)去處理。
4)Ao服務(wù) 發(fā)現(xiàn) 需要取數(shù)據(jù)。 它會(huì)生成一個(gè)請(qǐng)求包。把數(shù)據(jù)丟到消息隊(duì)列里去。然后會(huì)切回主進(jìn)程。繼續(xù)監(jiān)聽消息隊(duì)列
5)container 從消息隊(duì)列里接收到了 函數(shù)A處理完的結(jié)果。 就會(huì)立馬在切到服務(wù)Ao里去,繼續(xù)執(zhí)行。
6) 在掉到 函數(shù)B的時(shí)候 發(fā)現(xiàn)需要去別的進(jìn)程取數(shù)據(jù)。 然后跟函數(shù)A的處理一樣。這里就不說了。
打字好累。。。
7)container處理完了所有數(shù)據(jù)。 生成一個(gè)返回包。然后把它丟到消息隊(duì)列里。
8)netio 拿到返回包。 找到請(qǐng)求時(shí)的socket發(fā)送回去。
到這里一個(gè)基本的流程完了。
由于很多東西都沒有介紹。所以圖話的比較簡(jiǎn)陋、說明的也比較泛泛。 等后面慢慢介紹完細(xì)節(jié)。就明白了。
光看一個(gè)圖。很多東西看不出來的
下面先介紹下貫穿整個(gè)框架兩個(gè)比較核心的東西。
一個(gè)是消息隊(duì)列還有一個(gè)是協(xié)程。
這兩個(gè)東西 支持了系統(tǒng)的分布式部署。以及大并發(fā)的處理能力。以及無鎖編程
三、消息隊(duì)列
有比較才能看的更清晰
這里首先我們看下多線程編程下怎么處理包的。
(由于我沒有接觸過像騰訊、阿里這樣大型的多線程框架所以我這里只說以前公司寫的多線程處理模式。)
在多線程模式下。服務(wù)端會(huì)生自己成一個(gè)任務(wù)隊(duì)列。然后對(duì)這個(gè)隊(duì)列進(jìn)行加鎖操作。
然后服務(wù)每次收到一個(gè)請(qǐng)求包。就把請(qǐng)求包扔到任務(wù)隊(duì)列里。 然后繼續(xù)收包。仍包。
然后線程池會(huì)去 任務(wù)隊(duì)列里取任務(wù) 并處理
我們現(xiàn)在的這個(gè)框架中的消息隊(duì)列。就相當(dāng)于 一個(gè)任務(wù)隊(duì)列。
1) 因?yàn)槲覀冇孟到y(tǒng)消息隊(duì)列。 然后我們限制了消息隊(duì)列的大小。所以即使并發(fā)往消息隊(duì)列里塞消息。頂多也就是賽不進(jìn)去。對(duì)系統(tǒng)影響不到。 而且不用不用給隊(duì)列上鎖之類的操作。速度杠杠的。
2) netio 進(jìn)程起來的 時(shí)候會(huì)有一個(gè)消息隊(duì)列。 專門用來接收處理完的請(qǐng)求。然后把這些請(qǐng)求發(fā)送回給前端。
3)每個(gè)服務(wù) 會(huì)有兩個(gè)隊(duì)列。 一個(gè)叫請(qǐng)求隊(duì)列 一個(gè)叫回包隊(duì)列。
請(qǐng)求隊(duì)列是用來接收別的服務(wù)發(fā)送過來的請(qǐng)求的包。
回包隊(duì)列是服務(wù)本身請(qǐng)求別的服務(wù)。別的服務(wù)返回結(jié)果則放到這個(gè)回報(bào)隊(duì)列里
4) 所以 ipcs -q 的時(shí)候 會(huì)看到有一堆的消息隊(duì)列。
這樣的話可以看到 每個(gè)服務(wù)跟每個(gè)服務(wù)是相互獨(dú)立的。
他們都有自己的任務(wù)隊(duì)列。每個(gè)服務(wù)即可以是開始 也可以是結(jié)束。
但是 消息隊(duì)列并不是最快的。如果做的復(fù)雜可以用共享內(nèi)存。
但是 平臺(tái)用系統(tǒng)自帶消息隊(duì)列 給人感覺很清晰。也不會(huì)那么復(fù)雜。
四、協(xié)程
協(xié)程這個(gè)東西如果要說的話。還是有挺多東西說的。這里就細(xì)說。說些基本的東西
在我沒接觸協(xié)程的時(shí)候。 寫多線程服務(wù)端程序的時(shí)候。覺得多線程很牛逼。后臺(tái)接觸了這個(gè)框架。慢慢熟悉協(xié)程,發(fā)現(xiàn)協(xié)程更牛逼。。。。
但其實(shí)不能說協(xié)程比線程更厲害。只是應(yīng)用場(chǎng)景上不同。
多線程的好出我就不說了。這里說下多線程的缺點(diǎn)。
1)多線程 切換的時(shí)候 需要陷入內(nèi)核。切換的成本比較大。而且線程數(shù)過多。這個(gè)切換的成本會(huì)足增
2)多線程 編寫代碼的時(shí)候。常常會(huì)用到鎖。一來代碼沒寫好會(huì)造成死鎖,二來用鎖會(huì)減慢程序執(zhí)行的速度
而協(xié)程 剛好解決了這兩個(gè)問題
1)協(xié)程 切換 是在用戶空間,不需要陷入內(nèi)核。有程序員手動(dòng)控制。所以協(xié)程的切換成本非常低。
可以創(chuàng)建大量協(xié)程 而不會(huì)對(duì)系統(tǒng)有運(yùn)行有影響
2)寫協(xié)程代碼 其實(shí)大體上是順序思維。 基本上用不到鎖。
所以這里其實(shí)有個(gè)很重要的問題。由與協(xié)程相當(dāng)于順序執(zhí)行。所以一定不能阻塞。
在我們的平臺(tái)中。
1)AO服務(wù)一般是一個(gè)進(jìn)程。然后起50個(gè)協(xié)程。具體看業(yè)務(wù)量。如果業(yè)務(wù)量大可以起多個(gè)AO進(jìn)程
2)AO由于是用協(xié)程的。所以AO服務(wù)不能阻塞。任何阻塞的動(dòng)作。都不會(huì)在AO中出現(xiàn)。AO一把做業(yè)務(wù)處理。 就是 比如參數(shù)校驗(yàn)、if else 、賦值 、業(yè)務(wù)邏輯等等。
3)如果要去db或者緩存里取數(shù)據(jù)。 AO服務(wù)會(huì)調(diào)用DAO服務(wù)。
4)DAO服務(wù) 一般起10個(gè)進(jìn)程。主要用來去mysql和redis、等取數(shù)據(jù)。可以阻塞
所以這個(gè)模型下。再加上超時(shí)處理機(jī)制。
可以處理大量并發(fā)場(chǎng)景。
拍拍雖然沒有達(dá)到淘寶那樣的請(qǐng)求量。
但也是上億的請(qǐng)求并發(fā)。
so ,看完框架代碼以后 才發(fā)現(xiàn)這個(gè)框架寫的真是好。
但是我反而更好奇 淘寶那種。高并發(fā)的框架是什么樣的。
是否用到了多線程
先就介紹這么多吧。還有很多細(xì)節(jié)才組成了這個(gè)框架
后面再慢慢說
爭(zhēng)取每一個(gè)星期更新一篇吧。
努力在兩個(gè)月內(nèi)把框架看完
總結(jié)
以上是生活随笔為你收集整理的大型分布式C++框架《一:框架简介》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡逾期1万会坐牢吗?这些后果同样很严
- 下一篇: 十二、入侵防御系统