搜狗開源srpc,C++通用RPC框架
今年 7 月底,搜狗公司開源了內部的工業級 C++ 服務器引擎 Workflow。現如今,搜狗又宣布開源 Workflow 的生態項目——srpc,一個基于 Workflow 打造的輕量級 RPC 框架。
一個性能更好的 thrift/brpc
srpc 與 thrift/brpc 是協議與 IDL 均互通的。srpc 除了自帶的 sogou-std 協議以外,還實現了 baidu-std 協議和 thrift framed 協議,因此 srpc 可以與 thrift 或 brpc(連接池模式)互通。另外,接口描述文件支持 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 更為簡潔,以 server 的 rpc 接口為例:
一個通用、易擴展的RPC框架
除了支持 binary 傳輸,還支持 HTTP+json 和 HTTP+binary 的傳輸方式,業務可以借用 HTTP實現跨語言,而傳輸本身對業務透明。這是除了上述介紹的協議層和接口描述文件層以外,srpc 的另外一個重要層次。其中傳輸方式和協議層還可以互相結合,如果接收方為任何一種協議 +HTTP 作傳輸的 server,則用戶都可以對其輕松地發送一個如下請求:
srpc 內部實現層次精巧,非常注重縱向層次拆分和橫向解耦。其中壓縮層、序列化層、協議層是互相解耦的,利用函數重載、派生子類實現父類接口和模版特化等多種多態方式,來實現內部使用同一套代碼的高度復用。后續架構升級或者用戶進行二次開發,無論是中間再加一層、還是某層內橫向添加一種內容,都不需要改動現有的代碼,十分方便。
一個打通了 Workfflow、功能更強大的任務流 RPC
任務流是 Workflow 在設計之初就引入的概念,其可將資源高度封裝,用戶可不用關心內部細節、不接觸到連接池、線程池,僅需要了解業務關系就能實現復雜的業務邏輯。srpc 除了提供同步、半同步接口外,其異步接口可以利用 Context 拿到 Series 來打通 Workflow 任務流,這就意味著 srpc 可以把 RPC 調用當作任務流來組建。
srpc 還可以使用 Workflow 自帶的其他功能,一方面是服務治理。Workflow 的 upstream 是本進程內把一批機器綁定到一個域名下,自帶多種方式的負載均衡和熔斷恢復等機制,srpc 的 client 對應的是一個 ip,或者一個帶本地服務治理的集群,直接可以使用負載均衡和熔斷恢復等機制。
另一方面,srpc 還可以調用 Workflow 其他資源。RPC 只是網絡資源,而 Workflow 包含了如計算調度和異步文件 IO 等資源,還有目前已經實現的多種常用網絡協議(包括 HTTP、Redis、MySQL、Kafka),這些都可以為 srpc 所用。
搜狗方面表示,目前,srpc 已在搜狗搜索和搜狐集團團隊中多個線上業務中穩定使用了一段時間。由于接口簡介易上手,且直接打通 workflow 的任務流、計算調度、服務治理等功能,其對開發效率有了非常大的提升。
不過該團隊也指出,srpc 相對來說還是一個很年輕且代碼量不多(約一萬行)的項目,他們后續還會持續推進其生態建設,以為不同的 RPC 開發場景提供更加全面的解決方案。