Workflow異步調(diào)度框架 - 基本介紹篇

最近在努力同步維護(hù)文章積累~方便后續(xù)持續(xù)更新~
原文是2020年7月底開(kāi)源時(shí)po的,這里對(duì)近況進(jìn)行了調(diào)整和補(bǔ)充。
希望自己和項(xiàng)目都可以持續(xù)進(jìn)步 (??ヮ??)? 歡迎多多交流!

我們的項(xiàng)目C++ Workflow于兩天前開(kāi)源啦=>w<=

?? https://github.com/sogou/workflow

目前文檔、開(kāi)源管理及其他方面都在摸索推進(jìn)中,我也按捺不住想要以開(kāi)發(fā)者之一的名義,寫(xiě)一系列個(gè)人博客,讓大家可以從方方面面了解到workflow的全部信息~最官方的更新還是要以github為準(zhǔn),歡迎大家關(guān)注我們的項(xiàng)目,嘗試使用并提出寶貴意見(jiàn)。

項(xiàng)目主頁(yè)的README里已經(jīng)有非常詳細(xì)的介紹了,這里我來(lái)補(bǔ)充一些基本信息。本系列其他文章鏈接也會(huì)持續(xù)更新到這里。

一、 使用情況

Workflow是搜狗的C++服務(wù)器引擎,支撐搜狗和騰訊的海量線(xiàn)上請(qǐng)求,包括搜狗幾乎所有后端C++在線(xiàn)服務(wù),如搜索服務(wù),云輸入法,在線(xiàn)廣告等,每日處理超百億請(qǐng)求。這是一個(gè)設(shè)計(jì)輕盈優(yōu)雅的企業(yè)級(jí)程序引擎,是由首席架構(gòu)師帶領(lǐng)我們小幾人的虛擬團(tuán)隊(duì)經(jīng)歷一年多打磨出來(lái)并開(kāi)源的,可以滿(mǎn)足大多數(shù)C++后端開(kāi)發(fā)需求,目前開(kāi)源一年多了也在持續(xù)迭代中,開(kāi)發(fā)者社區(qū)也在用心維護(hù)。

除了公司內(nèi),很多中小型公司使用,有的是用作計(jì)算server,有的是用作異步MySQL客戶(hù)端,更多的是更加復(fù)雜的高吞吐低延遲異步流程復(fù)雜系統(tǒng),用以重構(gòu)基本基本性能提升好幾倍,輕松把cpu吃滿(mǎn),開(kāi)源一路以來(lái)能夠被認(rèn)可真的是一件非常振奮人心的事情。然而開(kāi)源對(duì)我們來(lái)說(shuō)只是剛剛開(kāi)始,這是一條充滿(mǎn)挑戰(zhàn)的道路。非常期待亮相于github的workflow未來(lái)可以擁有更多的可能性。

感慨完畢,說(shuō)回正題~在公司內(nèi)部和github中容易被用戶(hù)接納和使用,我認(rèn)為得益于以下幾個(gè)優(yōu)點(diǎn):

1.1 極其優(yōu)異的性能

我們這里說(shuō)的性能,不是單指如何跑滿(mǎn)cpu、如何單獨(dú)地讓網(wǎng)絡(luò)請(qǐng)求極速響應(yīng)、或者說(shuō)如何異步操作文件或其他設(shè)備,而是所有這些資源都可以被其具體的調(diào)度器管理,盡可能地全部都調(diào)度起來(lái)

由于workflow是個(gè)框架,除非是具體業(yè)務(wù)場(chǎng)景的前后對(duì)比否則很難給出benchmark,因此性能優(yōu)化因業(yè)務(wù)而已。但當(dāng)作webserver這一場(chǎng)景的話(huà),和業(yè)內(nèi)比較通用的nginx和brpc在吞吐和長(zhǎng)尾方面做了一些benchmark,可供大家參考:workflow benchmark。

值得一提的是,workflow用做proxy的時(shí)候,壓測(cè)最大QPS是echo server的結(jié)果的1/2,是workflow中異步調(diào)度無(wú)損耗的最好證明。

性能比nginx要好是很自然的,可以參考我先前的一篇用以改造異步調(diào)度QAT加速卡的小伙伴的測(cè)試,還沒(méi)細(xì)優(yōu)化,隨便看看:OpenSSL異步模式與Intel QAT加速卡(四) 新一代異步調(diào)度框架workflow

我老大、也就是項(xiàng)目主作者的習(xí)慣是喜歡把東西做到最簡(jiǎn)潔、把性能做到最極致,因此項(xiàng)目對(duì)性能的每一個(gè)細(xì)節(jié)都不會(huì)馬虎,本人受益匪淺。但是我們團(tuán)隊(duì)接觸開(kāi)源比較少,因此我個(gè)人非常希望能在性能優(yōu)化方面學(xué)習(xí)到更多優(yōu)秀的做法。

1.2 比其他C++框架更友好的用戶(hù)體驗(yàn)

我們給開(kāi)發(fā)者用戶(hù)接觸到的是task(任務(wù))和series(任務(wù)流):

  • task由工廠(chǎng)創(chuàng)建、自行銷(xiāo)毀;
  • series可以手動(dòng)從工廠(chǎng)創(chuàng)建或者自動(dòng)創(chuàng)建,也是自行銷(xiāo)毀。

用戶(hù)再也接觸不到連接池、線(xiàn)程池、包括想要做aio時(shí)的文件fd與各種異步通知機(jī)制。

從語(yǔ)言的發(fā)展來(lái)看,go的出現(xiàn)與被喜愛(ài)是必然的,原因之一就是天下苦C++久矣,而go的封裝很高級(jí)很簡(jiǎn)約。雖然C++后續(xù)也推出了各種新用法,但不是所有用戶(hù)都會(huì)升到更高的標(biāo)準(zhǔn),目前workflow的標(biāo)準(zhǔn)是C++11。

而任務(wù)和任務(wù)流的概念在理解和易用性上簡(jiǎn)直甩開(kāi)事件機(jī)制和用循環(huán)來(lái)做多次進(jìn)入的開(kāi)發(fā)模式十條街(后面這種模式真的太難了,我感覺(jué)自己也并沒(méi)有理解透徹,但發(fā)現(xiàn)OpenSSL的異步和grpc的異步server都是這樣做的)。但是,我們一開(kāi)始學(xué)習(xí)編程的時(shí)候,就知道要封裝函數(shù),而不是學(xué)習(xí)怎么做事件通知,學(xué)習(xí)的是最簡(jiǎn)單的for循環(huán)里執(zhí)行相同的代碼段,而不是用循環(huán)做多次重入實(shí)現(xiàn)不一樣的階段控制。而任務(wù)和任務(wù)流的封裝,就是函數(shù)和循環(huán)的封裝,是很貼近最基本的編程理念的。

關(guān)于OpenSSL中異步和aio的異步機(jī)制,以前寫(xiě)過(guò)一篇是做mac的aio模塊時(shí)對(duì)aio各種異步通知機(jī)制的拙見(jiàn),感興趣的小伙伴可以看看,并且歡迎給我指出錯(cuò)誤:異步I/O -- posix aio 從入門(mén)到放棄的吐血實(shí)踐。

1.3 通信計(jì)算資源融為一體的解決方案

我們特別適用于重計(jì)算,而搜索的絕大部分使用場(chǎng)景都是重計(jì)算的server,而網(wǎng)絡(luò)和計(jì)算都可以用workflow一并解決。

workflow認(rèn)為一切資源都是可以異步調(diào)度的,因此對(duì)于目前支持對(duì)接的資源,我鶸鶸地歸納對(duì)比了如下表格:

Workflow接管的6種基本資源與層次關(guān)系

計(jì)算這里詳細(xì)說(shuō)一下,原先檢索模塊開(kāi)發(fā)小伙伴常常面臨選擇高吞吐網(wǎng)絡(luò)框架的同時(shí),自己需要面對(duì)不同計(jì)算資源比例而劃分不同大小的線(xiàn)程池。

然而每種計(jì)算具體資源需求比例是動(dòng)態(tài)變化的,重要性也不一樣,后端響應(yīng)時(shí)長(zhǎng)也是動(dòng)態(tài)變動(dòng),如果我們?cè)诔跏蓟臅r(shí)候創(chuàng)建若干個(gè)特定大小的線(xiàn)程池,線(xiàn)程資源難以共用。

Go內(nèi)部的go routine調(diào)度就是用來(lái)解決這種事情的。那么C++來(lái)說(shuō),現(xiàn)在workflow可以和go一樣解決全局計(jì)算資源共享和按需調(diào)度的需求了,并且打通網(wǎng)絡(luò)、磁盤(pán)等等其他資源。

1.4 代碼架構(gòu)層次良好,易于拼裝,實(shí)現(xiàn)二次開(kāi)發(fā)

workflow的世界里有三個(gè)原則:

  • 串行是由任務(wù)組成的
  • 并行是由串行組成的
  • 并行是一種任務(wù)

于是乎,workflow是一套完備的、可以收斂一切循環(huán)和控制的任務(wù)流模型。

以下是我的一些個(gè)人解讀:

  1. 由于可以串行,我們就可以動(dòng)態(tài)建流圖,并且無(wú)限執(zhí)行下去;
  2. 由于可以并行,并行的是各個(gè)串行流,我們可以對(duì)多個(gè)并發(fā)執(zhí)行的流在完成時(shí)做收斂;
  3. 并行本身是一種任務(wù),因此可以加到串行流圖里,即每個(gè)任務(wù)都可以是一個(gè)復(fù)合任務(wù)組裝而成,組裝后提供給其他使用者使用,而使用者不需要關(guān)心復(fù)合任務(wù)內(nèi)部細(xì)節(jié),進(jìn)一步組裝。

當(dāng)然workflow的其他優(yōu)點(diǎn)很多,這些是公司內(nèi)部使用情況的一些總結(jié),其他的會(huì)陸續(xù)給大家介紹~今天其他點(diǎn)也不太寫(xiě)得完了,這里列個(gè)大概,后續(xù)會(huì)更新哦~

2. Workflow異步調(diào)度框架 - 架構(gòu)設(shè)計(jì)篇
3. Workflow異步調(diào)度框架 - 性能優(yōu)化上篇
4. Workflow異步調(diào)度框架 - 性能優(yōu)化網(wǎng)絡(luò)篇

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容