Categories
程式開發

搜狗開源srpc:自研高性能通用RPC框架


今年7月底,搜狗公司開源了內部的工業級C++服務器引擎Workflow,一路收穫業內許多認可和關注。 9月15日,作為Workflow最重要的生態項目——srpc,一個基於其打造的輕量級RPC框架,也在GitHub上開源了。

項目地址:https://github.com/sogou/srpc

一個性能更好的thrift/brpc

srpc與thrift/brpc是協議與IDL均互通的。 srpc除了自帶的sogou-std協議以外,還實現了baidu-std協議和thrift framed協議,因此srpc可以與thrift或brpc(連接池模式)互通。另外,接口描述文件支持protobuf和thrift,這意味著用戶不僅可以一鍵遷移基於protobuf或thrift作為IDL的項目,還可以用srpc作為一個性能更優的thrift框架或者brpc框架。

搜狗開源srpc:自研高性能通用RPC框架 1

與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接口為例:
搜狗開源srpc:自研高性能通用RPC框架 2
搜狗開源srpc:自研高性能通用RPC框架 3

一個通用、易擴展的RPC框架

除了支持binary傳輸,還支持HTTP+json和HTTP+binary的傳輸方式,業務可以藉用HTTP實現跨語言,而傳輸本身對業務透明。這是除了上述介紹的協議層和接口描述文件層以外,srpc的另外一個重要層次。其中傳輸方式和協議層還可以互相結合,如果接收方為任何一種協議+HTTP作傳輸的server,則用戶都可以對其輕鬆地發送一個如下請求:
搜狗開源srpc:自研高性能通用RPC框架 4

srpc內部實現層次精巧,非常注重縱向層次拆分和橫向解耦。其中壓縮層、序列化層、協議層是互相解耦的,利用函數重載、派生子類實現父類接口和模版特化等多種多態方式,來實現內部使用同一套代碼的高度復用。後續架構升級或者用戶進行二次開發,無論是中間再加一層、還是某層內橫向添加一種內容,都不需要改動現有的代碼,十分方便。

搜狗開源srpc:自研高性能通用RPC框架 5

一個打通了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:自研高性能通用RPC框架 6

srpc目前在搜狗搜索和搜狐集團團隊中多個線上業務已經穩定使用一段時間,由於接口簡潔易上手,且直接打通workflow的任務流、計算調度、服務治理等功能, 因此對開發效率有非常大的提升。但srpc相對來說也是一個很年輕且代碼量不多(約一萬行)的項目,搜狗後續還會持續推進其生態建設,有信心為不同的RPC開發場景提供更加全面的解決方案。