QQ高效團(tuán)隊(duì)開發(fā)實(shí)踐:開源毫秒服務(wù)引擎的設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
QQ高效團(tuán)隊(duì)開發(fā)實(shí)踐:開源毫秒服務(wù)引擎的設(shè)計(jì)與實(shí)現(xiàn)_第2頁(yè)
QQ高效團(tuán)隊(duì)開發(fā)實(shí)踐:開源毫秒服務(wù)引擎的設(shè)計(jì)與實(shí)現(xiàn)_第3頁(yè)
QQ高效團(tuán)隊(duì)開發(fā)實(shí)踐:開源毫秒服務(wù)引擎的設(shè)計(jì)與實(shí)現(xiàn)_第4頁(yè)
QQ高效團(tuán)隊(duì)開發(fā)實(shí)踐:開源毫秒服務(wù)引擎的設(shè)計(jì)與實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、開源毫秒服務(wù)引擎的設(shè)計(jì)與實(shí)現(xiàn)QQ團(tuán)隊(duì)開發(fā)運(yùn)營(yíng)實(shí)踐毫秒思路目錄毫秒亮點(diǎn)QQ后臺(tái)團(tuán)隊(duì)演進(jìn)毫秒功能毫秒思路目錄毫秒亮點(diǎn)QQ后臺(tái)團(tuán)隊(duì)演進(jìn)毫秒功能QQ后臺(tái)團(tuán)隊(duì)演進(jìn)黃金時(shí)代對(duì)美好的追求讓我們創(chuàng)造了毫秒青銅時(shí)代約50人的開發(fā)團(tuán)隊(duì),開發(fā)運(yùn)營(yíng)高度依賴開發(fā)和運(yùn)維白銀時(shí)代約200人的開發(fā)團(tuán)隊(duì),重點(diǎn)服務(wù)集中化,開發(fā)運(yùn)營(yíng)流程規(guī)范化模塊B的一個(gè)實(shí)例模塊A的一個(gè)實(shí)例后端模塊B基于Tag-Length-Value的二進(jìn)制協(xié)議模塊B路由Agent定期獲取模塊B路由配置更新青銅時(shí)代模塊A多進(jìn)程異步框架獲取后端B的可用實(shí)例模塊B路由配置中心名字發(fā)現(xiàn)和路由服務(wù)每個(gè)后端模塊提供自己的AgentAgent標(biāo)準(zhǔn)化:目錄/配置/共享內(nèi)存id

2、沖突各個(gè)Agent容錯(cuò)能力不一當(dāng)模塊需要調(diào)用10+個(gè)后端模塊時(shí)開發(fā)/運(yùn)維集體跳起來了模塊A多進(jìn)程異步框架模塊B0路由Agent模塊B1路由Agent.模塊Bn路由Agent模塊A的一臺(tái)服務(wù)器Tag-Length-Value協(xié)議根據(jù)Tag進(jìn)行擴(kuò)展,如獲取用戶的簡(jiǎn)單資料請(qǐng)求:dwQQ + wTagNum + wTag1 + + wTagN回包:wTagNum + (wTag1 + wLen1 + sValue1) + +(wTagN + wLenN + sValueN)沒有IDL化,無法自動(dòng)生成打解包代碼重復(fù)代碼無法體現(xiàn)程序員的“價(jià)值”各種奇葩的bugTag-Length-Value協(xié)議charb

3、uf64=0;char *p=buf;PACK_PUT_UINT32(p, dwQQ);p+=4;PACK_PUT_UINT16(p, Tags.size();p+=2;for (auto it = Tags.begin(); it !=Tags.end(); it+)PACK_PUT_UINT16(p, *it);p+=2;struct UserBasicInfostd:string sNick;uint16_t wFaceId;uint32_t dwBirthDate; for (uint16_t i = 0; iseq = gen_seq();/后端模塊B請(qǐng)求打包,填入seqPackMo

4、duleB(ctx-seq, req_str);/通過Agent API獲取后端模塊B的地址GetAddr(ModuleB_ID, &(ctx.srvaddr);/框架異步發(fā)包APIAsyncSend(ModuleB_ID, ctx, req_str);回包繼續(xù)處理/框架異步回包處理流程int HandleResponse(Context* ctx, int iID, void* pPkg, intiPkgLen) if(iID = ModuleB_ID) UnPackModuleB(pPkg, iPkgLen);/邏輯繼續(xù)處理.DelContext(ctx);/框架異步超時(shí)處理流程int H

5、andleTimeout(Context* ctx, int iID) 當(dāng)一個(gè)業(yè)務(wù)邏輯需要調(diào)用10+個(gè)后端模塊時(shí),代碼復(fù)雜度成幾何倍數(shù)上升!優(yōu)點(diǎn)缺點(diǎn)名字發(fā)現(xiàn)服務(wù)和路由服務(wù)服務(wù)容錯(cuò)可運(yùn)維性差;Agent容錯(cuò)能力參差不齊TLV協(xié)議可擴(kuò)展強(qiáng)重復(fù)編碼異步IO遠(yuǎn)程調(diào)用高性能隨業(yè)務(wù)流程復(fù)雜度增加,代碼可讀性和可維護(hù)性隨成倍數(shù)下降監(jiān)控和告警業(yè)務(wù)定制上報(bào);短信和郵件告警監(jiān)控點(diǎn)、告警點(diǎn)設(shè)置依賴開發(fā)意識(shí);告警多運(yùn)維累日志有本地和遠(yuǎn)程日志;有染色能力定位問題效率低服務(wù)路徑/命名/配置/工具/文檔等沒有統(tǒng)一標(biāo)準(zhǔn)開發(fā)自由發(fā)揮J運(yùn)維低效青銅時(shí)代反思集中化服務(wù)白銀時(shí)代模塊A多進(jìn)程協(xié)程框架后端模塊BProtobuf 協(xié)議名字

6、發(fā)現(xiàn)和路由Agent模塊A的一個(gè)實(shí)例定期更新后端服務(wù)的路由配置獲取后端服務(wù)的可用實(shí)例名字發(fā)現(xiàn)和路由服務(wù)發(fā)布管理統(tǒng)一監(jiān)控統(tǒng)一日志業(yè)務(wù)樹后端服務(wù)擴(kuò)縮容更新路由模塊B的一個(gè)實(shí)例白銀時(shí)代反思RPC!RPC!RPC!標(biāo)準(zhǔn)化開發(fā)運(yùn)營(yíng)體系積重難返集中化服務(wù)后端模塊BProtobuf RPC 協(xié)議定期更新后端服務(wù)的路由配置獲取后端服務(wù)的可用實(shí)例名字發(fā)現(xiàn)和路由服務(wù)發(fā)布管理統(tǒng)一監(jiān)控統(tǒng)一日志業(yè)務(wù)樹后端服務(wù)擴(kuò)縮容更新路由集中化控制臺(tái)黃金時(shí)代模塊A多進(jìn)程協(xié)程RPC框架名字發(fā)現(xiàn)和路由Agent模塊A的一個(gè)實(shí)例模塊B的一個(gè)實(shí)例毫秒思路目錄毫秒亮點(diǎn)QQ后臺(tái)團(tuán)隊(duì)演進(jìn)毫秒功能毫秒的設(shè)計(jì)思路標(biāo)準(zhǔn)化開發(fā)運(yùn)營(yíng)集中化管理立體化引擎自由與

7、相互傷害過度自由=相互傷害?模塊提供獨(dú)立的名字發(fā)現(xiàn)服務(wù)路由agent公共邏輯沒有抽象或組件化服務(wù)目錄、配置、工具、文檔沒有統(tǒng)一標(biāo)準(zhǔn)關(guān)鍵的監(jiān)控/日志項(xiàng)上報(bào)依賴開發(fā)意識(shí)從控制臺(tái)下載業(yè)務(wù)開發(fā)代碼實(shí)現(xiàn)具體業(yè)務(wù)邏輯毫秒標(biāo)準(zhǔn)化開發(fā)rpc GetList(GetListRequest) returns (GetListResponse);制定IDL協(xié)議int CMainLogicServiceMsg:GetList(constGetListRequest* request, GetListResponse* response)/* TODO 業(yè)務(wù)邏輯實(shí)現(xiàn),request/response為業(yè)務(wù)業(yè)務(wù)定義的pr

8、otobuf協(xié)議格式* 業(yè)務(wù)可使用框架自帶的監(jiān)控系統(tǒng)ATTR_REPORT(test), 詳見monitor.h*業(yè)務(wù)可使用框架自帶的日志系統(tǒng)NGLOG_DEBUG(test),詳見srpc_log.h*/return 0; 毫秒標(biāo)準(zhǔn)化開發(fā) RPC調(diào)用int CMainLogicServiceMsg:GetList(const GetListRequest* request,GetListResponse* response):crawl:GetListRequest req;:crawl:GetListResponse resp;req.set_type(request-type();/后端

9、模塊請(qǐng)求包/后端模塊返回包/后端模塊請(qǐng)求包設(shè)置int ret = CallMethod(VOA.Crawl,/*后端模塊路由名字*/crawl.CrawlService.GetList,/*RPC函數(shù)名*/req, resp, /*請(qǐng)求包和返回包反填*/20000, PORT_TYPE_TCP); /*超時(shí)時(shí)間和網(wǎng)絡(luò)類型*/ret非0為后端模塊收包異常;為0進(jìn)行后續(xù)業(yè)務(wù)邏輯/return 0;毫秒標(biāo)準(zhǔn)化部署上傳新的業(yè)務(wù)插件版本制定發(fā)布計(jì)劃進(jìn)行發(fā)布頁(yè)面展示發(fā)布結(jié)果#服務(wù)標(biāo)準(zhǔn)化部署根目錄#C+服務(wù),一級(jí)業(yè)務(wù)名|- MainLogic|- bin#二級(jí)業(yè)務(wù)名#框架、工具及業(yè)務(wù)插件路徑|- lib#框

10、架依賴庫(kù)及業(yè)務(wù)外部代碼庫(kù)/資源文件#配置文件路徑#日志路徑#PHP服務(wù),一級(jí)業(yè)務(wù)名| |- etc| - log|- VOA_php|- MainLogic|- bin|- lib- php#PHP插件路徑|- etc| - log- agent#集中化服務(wù)Agent路徑業(yè)務(wù)服務(wù)路徑示例/msec|- VOA_cpp集中化管理配置管理協(xié)議管理(IDL)外部代碼庫(kù)/資源文件業(yè)務(wù)版本容量管理服務(wù)IP列表擴(kuò)容/縮容管理發(fā)布管理發(fā)布版本管理及一鍵回滾發(fā)布列表運(yùn)營(yíng)層面業(yè)務(wù)層面監(jiān)控集中業(yè)務(wù)監(jiān)控單機(jī)監(jiān)控機(jī)器基礎(chǔ)監(jiān)控日志集中日志上報(bào)立體化引擎立體化引擎 毫秒RPC調(diào)用CallMethod(VOA.Crawl,

11、 crawl.CrawlService.GetList, req,resp, 20000, PORT_TYPE_TCP);通過名字發(fā)現(xiàn)和路由服務(wù)獲取可用實(shí)例,并自動(dòng)容錯(cuò)通過協(xié)程發(fā)起網(wǎng)絡(luò)請(qǐng)求,獲得和異步調(diào)用接近的性能監(jiān)控上報(bào):請(qǐng)求量,失敗率,超時(shí)率,平均時(shí)延,請(qǐng)求時(shí)延區(qū)間抽樣日志上報(bào),用于展示服務(wù)調(diào)用關(guān)系鏈RPC調(diào)用流程毫秒思路目錄毫秒亮點(diǎn)QQ后臺(tái)團(tuán)隊(duì)演進(jìn)毫秒功能毫秒服務(wù)引擎架構(gòu)名字發(fā)現(xiàn)和路由服務(wù)遠(yuǎn)程命令數(shù)據(jù)傳輸服務(wù)集中化服務(wù)管理頁(yè)面遠(yuǎn)程agentC+/Java/PHP毫秒開發(fā)框架路由agent開發(fā)&運(yùn)維Rediscluster數(shù)據(jù)服務(wù)#1Rediscluster數(shù)據(jù)服務(wù)#2.Redisclus

12、ter數(shù)據(jù)服務(wù)#NWeb運(yùn)維管理服務(wù)基于redis cluster 的k-v集群監(jiān)控agent日志agent其中一臺(tái)業(yè)務(wù)實(shí)例監(jiān)控服務(wù)日志服務(wù)集中化控制臺(tái)毫秒服務(wù)引擎展示1. 創(chuàng)建新模塊,定義IDL2. 獲取開發(fā)代碼3. 開發(fā)并生成插件4. 上傳插件及外部代碼庫(kù)/資源文件5. 制定發(fā)布計(jì)劃6. 觀察監(jiān)控和日志毫秒服務(wù)引擎展示1. 創(chuàng)建新模塊,定義IDL2. 獲取開發(fā)代碼3. 開發(fā)并生成插件4. 上傳插件及外部代碼庫(kù)/資源文件5. 制定發(fā)布計(jì)劃6. 觀察監(jiān)控和日志毫秒服務(wù)引擎展示1. 創(chuàng)建新模塊,定義IDL2. 獲取開發(fā)代碼3. 開發(fā)并生成插件4. 上傳插件及外部代碼庫(kù)/資源文件5. 制定發(fā)布計(jì)劃

13、6. 觀察監(jiān)控和日志int CMainLogicServiceMsg:GetTitles(const GetTitlesRequest*request, GetTitlesResponse* response):crawl:GetTitlesRequest req;:crawl:GetTitlesResponse resp;req.set_type(request-type();int ret = CallMethod(VOA.Crawl, crawl.CrawlService.GetMP3List, req, resp, 20000,PORT_TYPE_TCP);/ret非0為后端模塊收包異

14、常;為0進(jìn)行后續(xù)業(yè)務(wù)邏輯,組response包返回response.set_msg(resp-msg();return 0;毫秒服務(wù)引擎展示1. 創(chuàng)建新模塊,定義IDL2. 獲取開發(fā)代碼3. 開發(fā)并生成插件4. 上傳插件及外部代碼庫(kù)/資源文件5. 制定發(fā)布計(jì)劃6. 觀察監(jiān)控和日志毫秒服務(wù)引擎展示1. 創(chuàng)建新模塊,定義IDL2. 獲取開發(fā)代碼3. 開發(fā)并生成插件4. 上傳插件及外部代碼庫(kù)/資源文件5. 制定發(fā)布計(jì)劃6. 觀察監(jiān)控和日志毫秒服務(wù)引擎展示1. 創(chuàng)建新模塊,定義IDL2. 獲取開發(fā)代碼3. 開發(fā)并生成插件4. 上傳插件及外部代碼庫(kù)/資源文件5. 制定發(fā)布計(jì)劃6. 觀察監(jiān)控和日志毫秒思路

15、目錄毫秒亮點(diǎn)QQ后臺(tái)團(tuán)隊(duì)演進(jìn)毫秒功能毫秒服務(wù)引擎亮點(diǎn)? 高性能協(xié)程RPC框架? 服務(wù)容錯(cuò)? 過載保護(hù)? 調(diào)用鏈框圖? 多開發(fā)語(yǔ)言? KV管理平臺(tái)高性能協(xié)程 微線程框架? 微線程狀態(tài)機(jī)初始化可運(yùn)行運(yùn)行中等待? 上下文管理部分寄存器(callee save)、調(diào)用棧,私有棧幀? 事件調(diào)度Epoll I/O事件驅(qū)動(dòng)無搶占,無優(yōu)先級(jí)結(jié)束服務(wù)容錯(cuò)模塊A模塊B實(shí)例B1IDC1模塊B實(shí)例B3IDC3模塊B實(shí)例B2IDC2模塊A輪詢調(diào)用模塊B:如果沒有容錯(cuò):成功率降至66.7%網(wǎng)絡(luò)中斷或?qū)嵗惓DKA模塊B實(shí)例B1IDC1模塊B實(shí)例B3IDC3模塊B實(shí)例B2IDC2模塊A輪詢調(diào)用模塊B:如果實(shí)施了容錯(cuò):成功率

16、維持99.9%+網(wǎng)絡(luò)中斷或?qū)嵗惓U?qǐng)求上漲50%,那么模塊B如果要做到IDC容災(zāi),需要冗余50%實(shí)例服務(wù)容錯(cuò)策略? 快速屏蔽實(shí)例? 通過探測(cè)包緩慢增加權(quán)重,恢復(fù)屏蔽實(shí)例? 后端容量計(jì)算及過載保護(hù)從socket接收緩沖區(qū)接收用戶請(qǐng)求進(jìn)行本地邏輯處理發(fā)送請(qǐng)求到后端模塊B,等待后端模塊B返回接收后端模塊B的應(yīng)答應(yīng)答前端用戶,回到步驟1處理下一個(gè)請(qǐng)求模塊A的處理流程前端用戶過載介紹什么是過載?為什么要保護(hù)?系統(tǒng)接收緩沖區(qū)業(yè)務(wù)處理邏輯模塊B系統(tǒng)發(fā)送緩沖區(qū)模塊A超時(shí)時(shí)間1s超時(shí)時(shí)間100ms峰值請(qǐng)求量30/s平均時(shí)延20ms過載場(chǎng)景前端用戶業(yè)務(wù)處理邏輯模塊B系統(tǒng)接收緩沖區(qū)系統(tǒng)發(fā)送緩沖區(qū)模塊A超時(shí)超時(shí)時(shí)間1

17、s超時(shí)時(shí)間100ms峰值請(qǐng)求量200/s1.? 模塊B進(jìn)行了新特性發(fā)布,請(qǐng)求平均處理時(shí)延從20毫秒延長(zhǎng)至50毫秒2.? 操作失敗的用戶往往會(huì)重試,socket接收緩沖區(qū)一直保持滿的狀態(tài)3.? 當(dāng)一個(gè)用戶請(qǐng)求被追加到緩沖區(qū)里后,要等待50秒才能被進(jìn)程A取出來處理平均時(shí)延50ms緩沖區(qū)平均緩存1000個(gè)請(qǐng)求沒有過載保護(hù)的服務(wù)1009080706050403020100業(yè)務(wù)成功率在此刻過載9080706050403020100實(shí)施了過載保護(hù)的服務(wù)業(yè)務(wù)成功率100在此刻過載過載保護(hù)策略及早拒絕拒絕無效超時(shí)請(qǐng)求(T2-T0T超時(shí)間隔)處理中繼續(xù)拒絕超時(shí)請(qǐng)求(T2.X-T0T超時(shí)間隔)控制向后端模塊重試的

18、頻率系統(tǒng)緩沖區(qū)T0操作系統(tǒng)接收框架請(qǐng)求隊(duì)列工作進(jìn)程處理回包給請(qǐng)求端T1框架接收T2工作進(jìn)程接收T3完成處理T4回包給請(qǐng)求端請(qǐng)求包時(shí)序調(diào)用鏈框圖客戶端FriendListSvc.GetFriendList上報(bào)量:352平均耗時(shí):53msIMSvc.FriendListSvcFriendDBPxySvc. GetFriendList上報(bào)量:352平均耗時(shí):21msIMSvc.FriendDBPxySvc12調(diào)用鏈框圖示例IMSvc.FriendListSvc客戶端FriendListSvc.GetFriendList上報(bào)量:352平均耗時(shí):53msIMSvc. UserInfoSvcIMSvc.FriendDBPxySvcIMSvc. StatusSvcUserInfo.GetBasicInfo上報(bào)量:343平均耗時(shí):23msStatusSvc.GetUserStatus上報(bào)量:343平均耗時(shí):18msFriendDBPxySvc. GetFriendList上報(bào)量:352平均耗時(shí):21ms1332調(diào)用鏈

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論