<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Sogou C++ Workflow高性能 C++ 服務(wù)器引擎

          聯(lián)合創(chuàng)作 · 2023-10-01 14:36

          Sogou C++ Workflow 是搜狗公司的 C++ 服務(wù)器引擎,支撐搜狗幾乎所有后端 C++ 在線服務(wù),包括所有搜索服務(wù)、云輸入法與在線廣告等,每日處理超百億請(qǐng)求。這是一個(gè)設(shè)計(jì)輕盈優(yōu)雅的企業(yè)級(jí)程序引擎,可以滿足大多數(shù) C++ 后端開發(fā)需求。

          可以使用該項(xiàng)目:

          • 快速搭建http服務(wù)器:
          #include <stdio.h>
          #include "workflow/WFHttpServer.h"
          
          int main()
          {
              WFHttpServer server([](WFHttpTask *task) {
                  task->get_resp()->append_output_body("<html>Hello World!</html>");
              });
          
              if (server.start(8888) == 0) {  // start server on port 8888
                  getchar(); // press "Enter" to end.
                  server.stop();
              }
          
              return 0;
          }
          • 作為萬(wàn)能異步客戶端。目前支持httpredis,mysqlkafka協(xié)議。
          • 實(shí)現(xiàn)自定義協(xié)議client/server,構(gòu)建自己的RPC系統(tǒng)。
            • 搜狗RPC就是以它為基礎(chǔ),作為獨(dú)立項(xiàng)目開源。支持srpcbrpcthrift等協(xié)議(benchmark)。
          • 構(gòu)建異步任務(wù)流,支持常用的串并聯(lián),也支持更加復(fù)雜的DAG結(jié)構(gòu)。
          • 作為并行編程工具使用。除了網(wǎng)絡(luò)任務(wù),我們也包含計(jì)算任務(wù)的調(diào)度。所有類型的任務(wù)都可以放入同一個(gè)流中。
          • Linux系統(tǒng)下作為文件異步IO工具使用,性能超過(guò)任何標(biāo)準(zhǔn)調(diào)用。磁盤IO也是一種任務(wù)。
          • 實(shí)現(xiàn)任何計(jì)算與通訊關(guān)系非常復(fù)雜的高性能高并發(fā)的后端服務(wù)。
          • 構(gòu)建服務(wù)網(wǎng)格(service mesh)系統(tǒng)。
            • 項(xiàng)目?jī)?nèi)置服務(wù)治理與負(fù)載均衡等功能。

          編譯和運(yùn)行環(huán)境

          • 項(xiàng)目支持Linux,macOS,Windows等操作系統(tǒng)。
            • Windows版暫時(shí)以獨(dú)立branch發(fā)布,使用iocp實(shí)現(xiàn)異步網(wǎng)絡(luò)。用戶接口與Linux版一致。
          • 支持所有CPU平臺(tái),包括32或64位x86處理器,大端或小端arm處理器。
          • 需要依賴于OpenSSL,推薦OpenSSL 1.1及以上版本。
          • 項(xiàng)目使用了C++11標(biāo)準(zhǔn),需要用支持C++11的編譯器編譯。但不依賴boostasio。
          • 項(xiàng)目無(wú)其它依賴,但是包含了lz4,zstdsnappy幾個(gè)壓縮庫(kù)的無(wú)改動(dòng)源代碼(kafka協(xié)議需要)。

          系統(tǒng)設(shè)計(jì)特點(diǎn)

          典型后端服務(wù)器由以下三個(gè)部分組成,并且完全獨(dú)立開發(fā)。

          • 協(xié)議
            • 大多數(shù)情況下,用戶使用的是內(nèi)置的通用網(wǎng)絡(luò)協(xié)議,例如http,redis或各種rpc。
            • 用戶可以方便的自定義網(wǎng)絡(luò)協(xié)議,只需提供序列化和反序列化函數(shù),就可以定義出自己的client/server。
          • 算法
            • 在 Sogou C++ Workflow 的設(shè)計(jì)里,算法是與協(xié)議對(duì)稱的概念。
              • 如果說(shuō)協(xié)議的調(diào)用是rpc,算法的調(diào)用就是一次apc(Async Procedure Call)。
            • 提供了一些通用算法,例如sort,merge,psort,reduce,可以直接使用。
            • 與自定義協(xié)議相比,自定義算法的使用要常見得多。任何一次邊界清晰的復(fù)雜計(jì)算,都應(yīng)該包裝成算法。
          • 任務(wù)流
            • 任務(wù)流就是實(shí)際的業(yè)務(wù)邏輯,就是把開發(fā)好的協(xié)議與算法放在流程圖里使用起來(lái)。
            • 典型的任務(wù)流是一個(gè)閉合的串并聯(lián)圖。復(fù)雜的業(yè)務(wù)邏輯,可能是一個(gè)非閉合的DAG。
            • 任務(wù)流圖可以直接構(gòu)建,也可以根據(jù)每一步的結(jié)果動(dòng)態(tài)生成。所有任務(wù)都是異步執(zhí)行的。

          基礎(chǔ)任務(wù),任務(wù)工廠與復(fù)合任務(wù)

          • 系統(tǒng)中包含六種基礎(chǔ)任務(wù):通訊,文件IO,CPU,GPU,定時(shí)器,計(jì)數(shù)器。
          • 一切任務(wù)都由任務(wù)工廠產(chǎn)生,并且在callback之后自動(dòng)回收。
            • server任務(wù)是一種特殊的通訊任務(wù),由框架調(diào)用任務(wù)工廠產(chǎn)生,通過(guò)process函數(shù)交給用戶。
          • 大多數(shù)情況下,用戶通過(guò)任務(wù)工廠產(chǎn)生的任務(wù),都是一個(gè)復(fù)合任務(wù),但用戶并不感知。
            • 例如,一次http請(qǐng)求,可能包含許多次異步過(guò)程(DNS,重定向),但對(duì)用戶來(lái)講,就是一次通信任務(wù)。
            • 文件排序,看起來(lái)就是一個(gè)算法,但其實(shí)包括復(fù)雜的文件IO與CPU計(jì)算的交互過(guò)程。
            • 如果把業(yè)務(wù)邏輯想象成用設(shè)計(jì)好的電子元件搭建電路,那么每個(gè)電子元件內(nèi)部可能又是一個(gè)復(fù)雜電路。

          異步性和基于C++11 std::function的封裝

          • 不是基于用戶態(tài)協(xié)程。使用者需要知道自己在寫異步程序。
          • 一切調(diào)用都是異步執(zhí)行,幾乎不存在占著線程等待的操作。
            • 雖然我們也提供一些便利的半同步接口,但并不是核心的功能。
          • 盡量避免派生,以std::function封裝用戶行為,包括:
            • 任何任務(wù)的callback。
            • 任何server的process。符合FaaS(Function as a Service)思想。
            • 一個(gè)算法的實(shí)現(xiàn),簡(jiǎn)單來(lái)講也是一個(gè)std::function。但算法也可以用派生實(shí)現(xiàn)。

          內(nèi)存回收機(jī)制

          • 任何任務(wù)都會(huì)在callback之后被自動(dòng)內(nèi)存回收。如果創(chuàng)建的任務(wù)不想運(yùn)行,則需要通過(guò)dismiss方法釋放。
          • 任務(wù)中的數(shù)據(jù),例如網(wǎng)絡(luò)請(qǐng)求的resp,也會(huì)隨著任務(wù)被回收。此時(shí)用戶可通過(guò)std::move()把需要的數(shù)據(jù)移走。
          • SeriesWork和ParallelWork是兩種框架對(duì)象,同樣在callback之后被回收。
          • 項(xiàng)目中不使用std::shared_ptr來(lái)管理內(nèi)存。
          瀏覽 11
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲黄色网上视频 | 奇米狠狠av| 欧美操比在线视频 | 成人AV高清无码在线观 | 操综合天天干 |