<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>

          evpp基于 libevent 開發(fā)的 C++ 11 高性能網(wǎng)絡(luò)服務(wù)器

          聯(lián)合創(chuàng)作 · 2023-09-29 12:30

          evpp是一個(gè)基于libevent開發(fā)的現(xiàn)代化C++11高性能網(wǎng)絡(luò)服務(wù)器,自帶TCP/UDP/HTTP等協(xié)議的異步非阻塞式的服務(wù)器和客戶端庫。

          特性:

          • 現(xiàn)代版的C++11接口

          • 非阻塞異步接口都是C++11的functional/bind形式的回調(diào)仿函數(shù)(不是libevent中的C風(fēng)格的函數(shù)指針)

          • 非阻塞純異步多線程TCP服務(wù)器/客戶端

          • 非阻塞純異步多線程HTTP服務(wù)器/客戶端

          • 非阻塞純異步多線程UDP服務(wù)器

          • 支持多進(jìn)程模式

          • 優(yōu)秀的跨平臺特性和高性能(繼承自libevent的優(yōu)點(diǎn))

          除此之外,基于該庫之上,還提供兩個(gè)附帶的應(yīng)用層協(xié)議庫:

          • evmc :一個(gè)純異步非阻塞式的memcached的C++客戶端庫,支持membase集群模式。詳情請見:evmc readme

          • evnsq : 一個(gè)純異步非阻塞式的NSQ的C++客戶端庫,支持消費(fèi)者、生產(chǎn)者、服務(wù)發(fā)現(xiàn)等特性。詳情請見:evnsq readme
            將來還會推出redis的客戶端庫。

          由來:

          我們開發(fā)小組負(fù)責(zé)的業(yè)務(wù)需要用到TCP協(xié)議來建設(shè)長連接網(wǎng)關(guān)服務(wù)和一些其他的一些基于TCP的短連接服務(wù),在調(diào)研開源項(xiàng)目的過程中,沒有發(fā)現(xiàn)一個(gè)合適的庫來滿足我們要求。結(jié)合我們自身的業(yè)務(wù)情況,理想中的C++網(wǎng)絡(luò)庫應(yīng)具備一下幾個(gè)特性:

          • 接口簡單易用,最好是C++接口

          • 多線程,也能支持多進(jìn)程

          • 最好是基于libevent實(shí)現(xiàn)(因?yàn)楝F(xiàn)有的歷史遺留框架、基礎(chǔ)庫等是依賴libevent),這樣能很方便嵌入libevent的事件循環(huán),否則改動較大或者集成起來的程序可能會有很多跨線程的調(diào)用

          基于這些需要,可供選擇的不多,所以我們只能自己開發(fā)一個(gè)。開發(fā)過程中,接口設(shè)計(jì)方面基本上大部分是參考muduo項(xiàng)目來設(shè)計(jì)和實(shí)現(xiàn)的,當(dāng)然也做了一些取舍和增改;同時(shí)也大量借鑒了Golang的一些設(shè)計(jì)哲學(xué)和思想,舉幾個(gè)小例子來說明一下:

          1. Duration : 這是一個(gè)時(shí)間區(qū)間相關(guān)的類,自帶時(shí)間單位信息,參考了Golang項(xiàng)目中的Duration實(shí)現(xiàn)。我們在其他項(xiàng)目中見到太多的時(shí)間是不帶單位的,例如timeout,到底是秒、毫秒還是微秒?需要看文檔說明或具體實(shí)現(xiàn),好一點(diǎn)的設(shè)計(jì)會將單位帶在變量名中,例如timeout_ms,但還是沒有Duration這種獨(dú)立的類好。目前C++11中也有類似的實(shí)現(xiàn)std::chrono::duration,但稍顯復(fù)雜,沒有咱們這個(gè)借鑒Golang實(shí)現(xiàn)的版本來的簡單明了。

          2. Buffer : 這是一個(gè)緩沖區(qū)類,融合了muduo和Golang兩個(gè)項(xiàng)目中相關(guān)類的設(shè)計(jì)和實(shí)現(xiàn)

          3. http::Server : 這是一個(gè)http服務(wù)器類,自帶線程池,它的事件循環(huán)和工作線程調(diào)度,完全是線程安全的,業(yè)務(wù)層不用太多關(guān)心跨線程調(diào)用問題。同時(shí),還將http服務(wù)器的核心功能單獨(dú)抽取出來形成

          4. http::Service類,是一個(gè)可嵌入型的服務(wù)器類,可以嵌入到已有的libevent事件循環(huán)中。
            網(wǎng)絡(luò)地址的表達(dá)就僅僅使用"ip:port"這種形式字符串表示,就是參考Golang的設(shè)計(jì)

          5. httpc::ConnPool是一個(gè)http的客戶端連接池庫,設(shè)計(jì)上盡量考慮高性能和復(fù)用。以后基于此還可以增加負(fù)載均衡和故障轉(zhuǎn)移等特性。


          另外,我們實(shí)現(xiàn)過程中極其重視線程安全問題,一個(gè)事件相關(guān)的資源必須在其所屬的EventLoop中初始化和析構(gòu)釋放,這樣我們能最大限度的減少出錯(cuò)的可能。為了達(dá)到這個(gè)目標(biāo)我們重載event_add和event_del等函數(shù),每一次調(diào)用event_add,就在對應(yīng)的線程私有數(shù)據(jù)中記錄該對象,在調(diào)用event_del時(shí),檢查之前該線程私有數(shù)據(jù)中是否擁有該對象,然后在整個(gè)程序退出前,再完整的檢查所有線程的私有數(shù)據(jù),看看是否仍然有對象沒有析構(gòu)釋放,詳細(xì)代碼實(shí)現(xiàn)可以參考 https://github.com/Qihoo360/evpp/blob/master/evpp/inner_pre.cc#L46~L87。我們?nèi)绱丝量痰淖非缶€程安全,只是為了讓一個(gè)程序能安靜的平穩(wěn)的退出或Reload,因?yàn)槲覀兩羁痰睦斫狻熬帉懹肋h(yuǎn)運(yùn)行的系統(tǒng),和編寫運(yùn)行一段時(shí)間后平靜關(guān)閉的系統(tǒng)是兩碼事”,后者要困難的多。

          瀏覽 29
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  天堂中文最新版在线官网8 | 最新中文av | 乱伦日韩欧美 | 在线亚洲黄色电影 | 羞羞午夜福利视频 |