高性能、低開發門檻,搜狗開源輕量級RPC框架srpc
不久之前,搜狗開源了一個輕量級的 RPC 框架——srpc。這是一個基于 Sogou C ++ Workflow 的 RPC 項目,通過解析部分 IDL(接口描述文件) 和進行代碼生成,實現了與 workflow 底層通信框架的對接和非常簡潔的用戶接口。
srpc 整個項目的代碼量約有一萬行,目前已經在搜狗搜索和搜狐集團團隊的多個線上業務中穩定應用。srpc 接口簡潔易上手,直接打通了 workflow 的任務流、計算調度、服務治理等功能, 可以快速提升開發效率,對于現有的 pb / thrift 描述文件的項目,也可以做到一鍵遷移。
1. srpc 項目的架構
srpc 項目支持多個層級的縱向拆解和橫向解耦,其中主要包括的層級有用戶代碼、IDL 序列化、數據組織、壓縮、協議和通信。
這些層級之間可以相互拼裝,如果想要實現一套代碼的高度復用也有多種方式,例如函數重載、派生子類實現父類接口和模版特化等。之后,如果想要進行架構升級,也可以在中間再加一層,或是在某層內橫向添加一些內容。
對于用戶來說,可能更關心的是 method,request,response。對應到 srpc 項目中就是接口描述文件層、RPC 協議層、網絡通信層。
其中,接口描述文件層支持多種 IDL 格式,包括 Protobuf 和 Thrift;RPC 協議層支持 Thrift-binary、BRPC-std 和 SogouRPC-std;網絡通信層支持 TCP、TPC_SSL、HTTP、HTTPS、HTTP2。
基礎功能對比圖
2. srpc 項目的性能
前文提到 srpc 的接口描述文件層支持 protobuf 和 thrift,這意味著用戶不僅可以一鍵遷移基于 protobuf 或 thrift 作為 IDL 的項目,還可以用 srpc 作為一個性能更優的 thrift 框架或者 brpc 框架。
與 thrift 相比,srpc 所實現的 thrift framed 協議在吞吐和長尾方面性能都遠超 thrift 原生框架。srpc 對于 thrift 接口描述文件實現了解析和代碼生成,用戶在 srpc 上使用 thrift IDL 時無需依賴 thrift 庫。
而在 baidu-std 協議的實現上,吞吐和長尾在大部分場景下依然是 srpc 更優。由于 workflow 支持 Windows(同機性能比 linux 快 20%),所以用戶得以在 Windows 下使用 brpc。另外,同樣是支持 protobuf 的 RPC 框架,由于 srpc 實現了部分 IDL 解析和代碼生成,接口形式無需受 protobuf 原始限制,因而所提供的接口比 brpc 更為簡潔。
在易用性和可擴展性方面,用戶可以通過 http+json 實現跨語言,如果是 server 提供方,用任何語言的 http server 接受 post 請求,解析若干 http header 即可;如果是 client 調用方,用任何語言的 http client 發送 post 請求,添加若干 http header 即可。
3. 與 workflow 的協作
srpc 是一個基于 Sogou C ++ Workflow 的 RPC 項目,所以天然就兼容 workflow 的使用方式,例如提供創建任務的接口來創建一個 rpc 任務、可以把 rpc 任務放到任務流圖中,回調函數里也可以拿到當前的任務流、支持 workflow 所支持的其他功能,包括 upstream、計算調度、異步文件 IO 等。
同時,srpc 與 workflow 一起協作還可以完成很多其它事情:
- srpc 提供了同步、半同步、異步的接口,異步接口可以用來打通 workflow 任務流;
- 服務治理:workflow 的 upstream 是本進程內把一批機器綁定到一個域名下的 upstream 管理,自帶多種方式的負載均衡和熔斷恢復等機制,srpc 的 client 都可以直接拿來用,一個 client 創建出來對應的是一個 ip 或者帶本地服務治理的集群;
- Client 和 task 其他層級的配置,比如 workflow 的各種超時都可以用上,workflow 的網絡請求本身有重試次數,rpc 默認配為 0,有需要的話用戶可以自行配置;
- 其他系統資源,rpc 只是網絡相關,而 workflow 包含了如計算和異步文件 IO 等資源,這些在打通了任務流之后,都可以為 srpc 所用。
srpc 項目開源地址:
https://github.com/sogou/srpc




































