轉自: 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
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 |
下面是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相關代碼。
打開生成代碼放置目錄下的Makefile文件。
#choose to use boost for network
#LDFLAGS := $(PLUGIN_BOOST_LDFLAGS) $(LDFLAGS)
能夠看到以上兩行,取消註釋掉第二行,從新make clean, make便可開啓boost對PhxRPC的優化。開啓前記得編譯好PhxRPC的boost插件。
uthread_begin
, uthread_end
, uthread_s
, uthread_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個宏定義,以同步代碼的寫法,進行更自定義的併發訪問。