? ? ? ? brpc又稱為baidu-rpc,是百度開發一款“遠過程調用”網絡框架。目前該項目已在github上開源——https://github.com/brpc/brpc。(轉載請指明出于breaksoftware的csdn博客)
? ? ? ? 據目前公開的資料,我們發現百度內部從2010年開始,開發過若干rpc框架:ub系列rpc(ubrpc,nova_pbrpc、public_pbrpc),hulu-pbrpc、sofa-pbrpc和本文介紹的baidu-rpc。從命名來看,我們并不太清楚ub、hulu和sofa是啥,但是可以確認的是我們知道baidu是什么意思。如果一款產品敢用公司名字來命名,可以見得該產品在公司內部的認可度——可以代表公司水平的產品。
? ? ? ? 然后從應用方面看,brpc目前被應用于百度公司內部各種核心業務上,據github上的overview.md資料,包括:高性能計算和模型訓練和各種索引和排序服務,且有超過100萬以上個實例是基于brpc工作的。
? ? ? ? 有大公司核心業務背書,我覺得這個項目還是可以玩玩的。
? ? ? ? 目前github上有原汁原味的技術文檔,似乎是直接把公司內部文件放了出來。但是我們在外網接觸不到他們的核心業務,更接觸不到什么UB、hulu或者sofa(似乎sofa-pbrpc也是開源的)等技術。所以部分文檔我們可以無視。這樣我們就可以將關注重心放在它的設計思想、性能、易用性以及和主流開源rpc的對比上。
? ? ? ? 當然在談這些前,需要知道什么是rpc。rpc全稱是Remote Procedure Call,即遠過程調用。我們先了解下“過程調用”這個概念。比如我們有如下代碼
void a() { printf("a excuten");}void b() { printf("b excuten"); a();}
? ? ? ? a、b函數我們可以認為它們各是一個“過程”。其中b函數調用了a函數,我們可以認為b過程調用了a過程,這個步驟我們可以稱為一次“過程調用”。這也是我們最普遍見到的“過程調用”形式。
? ? ? ? 從宏觀層面來看,a、b業務邏輯都在一臺機器的一個進程的一個線程中被執行的;從微觀層面,調用過程使用的全是本地資源——發生的變化僅限于本機的內存、CPU和顯示設備。于是這個過程我們可以稱為本地過程調用——Local Procedure Call。
? ? ? ? 然而隨著業務發展,a函數所要執行的業務越來越復雜,我們可能會讓其獨立成為一個進程而存在。這樣a、b函數將在同一臺機器不同進程中執行。此時b函數想調用a函數,就需要使用管道等技術進行跨進程通信。這種調用我們還是稱為本地過程調用。
? ? ? ? 再進一步,我們需要把a函數對應的邏輯作為一個獨立的服務。這樣承載a、b的服務可能部署于不同的機器上。此時b函數調用a函數的過程,需要跨越網絡,我們稱這種調用為“遠過程調用”。
? ? ? ? 那么b函數是如何“遠過程調用”a函數的呢?一般a函數對應的進程會開放一個網絡端口,它接受某種協議(比如HTTP)的請求,然后把結果打包成對應的協議格式返回。b函數所在的進程則發起該請求,然后接收返回結果。
? ? ? ? 但是這種設計無意增加了代碼開發者的工作量。因為本來就一個本地函數調用就能解決問題,現在卻需要:編寫a函數對應的服務、編寫b訪問網絡的邏輯。這其中摻雜了網絡、數據序列化等方面知識,開發難度直線上升。
? ? ? ? 大家開始想辦法,如果我們能降低上述開發難度,讓開發者不需要懂網絡編程、不需要懂協議解析,就像寫本地調用代碼一樣做開發就好了。于是rpc框架就被研發出來了,市面上的google出品的grpc、facebook出品的thrift以及本文介紹的百度出品的brpc就是這類產品。
? ? ? ? 以brpc為例,我們看一個遠過程調用是如何被調用的
#include <brpc/channel.h>#include "echo.pb.h" …… brpc::Channel channel; brpc::ChannelOptions options; // 設置超時、協議等信息 …… example::EchoRequest request; example::EchoResponse response; // 設置參數 request.set_message("hello world"); // 設置調用樁 example::EchoService_Stub stub(&channel); brpc::Controller cntl; // 發起調用 stub.Echo(&cntl, &request, &response, NULL); // 檢測并分析結果 ……
? ? ? ? 可以見得,這段代碼內容比較好的隱藏了網絡知識——本地調用也存在超時和協議的概念。我們就像調用本地過程一樣調用了Echo方法。
? ? ? ? 相應的遠過程調用的遠端——服務端代碼如下
#include <brpc/server.h>#include "echo.pb.h"……namespace example {class EchoServiceImpl : public EchoService {public: EchoServiceImpl() {}; virtual ~EchoServiceImpl() {}; virtual void Echo(google::protobuf::RpcController* cntl_base, const EchoRequest* request, EchoResponse* response, google::protobuf::Closure* done) { brpc::ClosureGuard done_guard(done); brpc::Controller* cntl = static_cast<brpc::Controller*>(cntl_base); // Fill response. response->set_message(request->message()); }};} // namespace exampleint main(int argc, char* argv[]) { // Parse gflags. We recommend you to use gflags as well. GFLAGS_NS::ParseCommandLineFlags(&argc, &argv, true); // Generally you only need one Server. brpc::Server server; // Instance of your service. example::EchoServiceImpl echo_service_impl; if (server.AddService(&echo_service_impl, brpc::SERVER_DOESNT_OWN_SERVICE) != 0) { LOG(ERROR) << "Fail to add service"; return -1; } // Start the server. brpc::ServerOptions options; options.idle_timeout_sec = FLAGS_idle_timeout_s; if (server.Start(FLAGS_port, &options) != 0) { LOG(ERROR) << "Fail to start EchoServer"; return -1; } // Wait until Ctrl-C is pressed, then Stop() and Join() the server. server.RunUntilAskedToQuit(); return 0;}
? ? ? ? 我們關注于EchoServiceImpl的實現。它主要暴露了Echo方法,我們只要填充它的業務就行了,而main函數中的套路是固定的。
? ? ? ? 可以見得使用rpc框架大大降低了我們開發的難度。
? ? ? ? 在易用性相似的情況下,我們再對比一下brpc和grpc、thrift的差別。以下數據和圖片都來源于brpc在github上公布的調研結果
? ? ? ? 上圖是一個Client端向一個Server端發送的數據隨著數據包大小變化而導致QPS變化的關系圖。我們看到:
? ? ? ? 上圖是多個Client向一個Server發請求時,Client端數量和Server的QPS數量之間的關系圖。我們可以看到:
? ? ? ? 上圖反映出Server開啟的線程數和QPS之間的關系。隨著服務器性能越來越好,CPU核心數也越來越多,我們可以開啟更多的線程數來增加服務的處理能力,所以這個關系圖很有意義。
? ? ? ? ?brpc為什么會有此特性。這兒就需要介紹一下其使用的bthread庫。據公開的資料介紹,其特點是:
? ? ? ? 除了看QPS,我們還要看處理延時。如果一個服務雖然QPS很高,但是每個請求都延遲很久處理,就會導致服務的平均響應時間變大。
跨機多client→單server在固定QPS下的延時CDF(越左越好,越直越好)
? ? ? ??X軸是延時(微秒),Y軸是小于X軸延時的請求比例。這意味著變化曲線越靠近左邊(延時短),越直(請求比例變化小)越好。
? ? ? ? 關于編譯brpc,可以參見https://github.com/brpc/brpc/blob/master/docs/cn/getting_started.md。但是一些環境問題,導致有些軟件不能安裝,就需要自己編譯了。
? ? ? ? 我把在Ubuntu Server 18版本上的編譯的過程貼出來,供大家參考。
sudo apt install makesudo apt install gccsudo apt install g++sudo apt install libleveldb-devsudo apt install libgflags-devsudo?apt?install opensslsudo apt install libssl-dev
? ? ? ? zlib是源碼編譯的
wget http://www.zlib.net/zlib-1.2.11.tar.gz .tar -xzvf zlib-1.2.11.tar.gzcd zlib-1.2.11./configure -prefix=/usrsudo makesudo make install
? ? ? ? protobuf是源碼編譯的
sudo apt-get install autoconf automake libtoolgit clone https://github.com/google/protobuf.gitcd protobuf./autogen.sh./configure --prefix=/usr -with-PACKAGE=yescd protobufsudo makesudo make install
? ? ? ? 最后還要修改下Makefile文件——增加"-std=c++11"
protoc-gen-mcpack: src/idl_options.pb.cc src/mcpack2pb/generator.o libbrpc.a @echo "Linking $@"ifeq ($(SYSTEM),Linux) @$(CXX) -o $@ $(HDRPATHS) -std=c++11 $(LIBPATHS) -Xlinker "-(" $^ -Wl,-Bstatic $(STATIC_LINKINGS) -Wl,-Bdynamic -Xlinker "-)" $(DYNAMIC_LINKINGS)else ifeq ($(SYSTEM),Darwin) @$(CXX) -o $@ $(HDRPATHS) -std=c++11 $(LIBPATHS) $^ $(STATIC_LINKINGS) $(DYNAMIC_LINKINGS)endif
? ? ? ? 一切準備就緒,到brpc的目錄下執行
sh config_brpc.sh --headers=/usr/include --libs=/usr/libmake
? ? ? ? 最后切換到example/echo_c++目錄下,make出server和client,執行查看效果
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
二顆紅心表示什么意思?兩顆心表示心心相印。愛是個體(大多是人)之間強烈的依戀、親近和向往,也是一種無私的、全力以赴的情感。通常是愛和的對比。愛情由兩部分組成:愛和性。愛情是愛情的靈魂,性是愛情的附加屬性,沒有存在的必要。愛是愛情的根和核心。什么輸入法能打出這個??(黑色的愛心)?使用搜狗輸入法和百度輸入法,搜索 "心臟和心臟or "符號 "通過搜索引擎和復制。微信朋友圈比心手勢符號怎么輸入?可以...
命運絲線任務哪里接?,這個任務完全發生在奧林匹斯。如果你找到命運作家,你就能得到它。NPC位置的坐標是(20.4,50.2)。魔獸世界命運絲線?wow命運的絲線在哪里...達拉然商業區...達拉然商業區...問NPC要達拉然的布店~ ~ ~如果做劍柄任務,NPC在二樓陽臺。...魔獸世界9.0命運絲線怎么觸發?,首先我們開始游戲。2.然后我們進入登錄界面。3.然后我們 我們會找到塔爾的。4.和他談...
現在市面上有沒有除了百度以外的靠譜搜索引擎?書籍、視頻、各種教程等。我們一般都喜歡在百度的在線盤上尋找資源。其實,“西林街尋”的資源也非常豐富。整個網絡資源的垂直搜索引擎是在線磁盤搜索的產物。視頻、音樂、文章、購物、信息熱點等搜索引擎,一鍵切換,超級高效簡單,讓您無需在多個網站之間來回切換。集成多個電子書資源平臺,無需注冊,免費下載。對電子書愛好者來說是個好消息。新電影上映后,我們可以花錢去電影院...