轉: 微信開源C/C++ RPC框架PhxRPC

轉自: http://mp.weixin.qq.com/s?__biz=MzI4NDMyNTU2Mw==&mid=2247483734&idx=1&sn=da364812eca086532f58bbdfaa4b4fd2&scene=0#wechat_redirectgit

 

PhxRPC是微信後臺團隊推出的一個很是簡潔小巧的RPC框架,編譯生成的庫只有450K。github

 

開源地址:微信

https://github.com/tencent-wechat/phxrpc數據結構

點擊閱讀原文可自動跳轉到github地址併發

總覽

  • 使用Protobuf做爲IDL用於描述RPC接口以及通訊數據結構。框架

  • 基於Protobuf文件自動生成Client以及Server接口,用於Client的構建,以及Server的實現。異步

  • 半同步半異步模式,採用獨立多IO線程,經過Epoll管理請求的接入以及讀寫,工做線程採用固定線程池。IO線程與工做線程經過內存隊列進行交互。函數

  • 提供完善的過載保護,無需配置閥值,支持動態自適應拒絕請求。工具

  • 提供簡易的Client/Server配置讀入方式。性能

  • 基於lambda函數實現併發訪問Server,能夠很是方便地實現Google提出的 Backup Requests 模式。

侷限

  • 不支持多進程模式。

性能

使用Sample目錄下的Search RPC C/S進行Echo RPC調用的壓測,至關於Worker空轉狀況。

運行環境

CPU:24 x Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
內存:32 GB
網卡:千兆網卡
Client/Server機器之間PING值: 0.05ms
請求寫入併發:1000個線程
業務數據大小:除去HTTP協議部分20b
Worker線程數:20

性能測試結果(qps)

短鏈接

ucontext類型/IO線程 1 3 8 20
system 4.1w 8.5w 9w 9.2w
boost 4.5w 9.5w 9.5w 9.5w

長鏈接

ucontext類型/IO線程 1 3 8 20
system 5.5w 16w 36w 50w
boost 6.2w 17.5w 41w 50w

如何使用

編寫proto文件

下面是sample目錄下的proto文件樣例。

生成代碼

(PhxRPC根目錄)/codegen/phxrpc_pb2server 
-I (PhxRPC根目錄) -I (Protobuf include目錄) -f (proto文件路徑) -d (生成代碼放置路徑)

#sample
../codegen/phxrpc_pb2server -I ../ -I ../third_party/protobuf/include -f search.proto -d .

調用完工具後,在生成代碼放置目錄下執行make,便可生成所有的RPC相關代碼。

選擇是否啓用boost優化

打開生成代碼放置目錄下的Makefile文件。

#choose to use boost for network

#LDFLAGS := $(PLUGIN_BOOST_LDFLAGS) $(LDFLAGS)

能夠看到以上兩行,取消註釋掉第二行,從新make clean, make便可開啓boost對PhxRPC的優化。開啓前記得編譯好PhxRPC的boost插件。

補充本身的代碼

Server(xxx_service_impl.cpp)

Client (xxx_client.cpp)

Client併發調用樣例

uthread_beginuthread_enduthread_suthread_t這幾個關鍵字是PhxRPC自定義的宏,分別表示協程的準備,結束,協程調度器以及協程的建立。

上面的代碼實現了Google提出的 Backup Requests 模式。實現的功能是分別對兩個Server同時發起Echo調用,當有一個Server響應的時候,則整個函數結束。在這段代碼裏面,咱們提供了一種異步IO的同步寫法,並給予了一些方便使用的宏定義。首先使用uthread_begin進行準備,而後使用uthread_t以lambda的形式建立一個協程,而在任意一個協程裏面均可使用咱們PhxRPC生成的Client API進行RPC調用,並可以使用uthread_s隨時結束全部RPC調用。最後的uthread_end真正經過協程調度發起這些lambda內的RPC調用,並等待結束。

固然你能夠借用這4個宏定義,以同步代碼的寫法,進行更自定義的併發訪問。

Server配置說明 (xxx_server.conf)

相關文章
相關標籤/搜索