今年7月底,搜狗公司開源了內(nèi)部的工業(yè)級C++服務(wù)器引擎Workflow,一路收獲業(yè)內(nèi)許多認(rèn)可和關(guān)注。9月15日,作為Workflow最重要的生態(tài)項目——srpc,一個基于其打造的輕量級RPC框架,也在GitHub上開源了。
GitHub搜索“sogou srpc”即可找到該項目。
一個性能更好的thrift/brpc
srpc與thrift/brpc是協(xié)議與IDL均互通的。srpc除了自帶的sogou-std協(xié)議以外,還實現(xiàn)了baidu-std協(xié)議和thrift framed協(xié)議,因此srpc可以與thrift或brpc(連接池模式)互通。另外,接口描述文件支持protobuf和thrift,這意味著用戶不僅可以一鍵遷移基于protobuf或thrift作為IDL的項目,還可以用srpc作為一個性能更優(yōu)的thrift框架或者brpc框架。
與thrift相比,srpc所實現(xiàn)的thrift framed協(xié)議在吞吐和長尾方面性能都遠(yuǎn)超thrift原生框架。且srpc對于thrift接口描述文件實現(xiàn)了解析和代碼生成,因此用戶在srpc上使用thrift IDL時無需依賴thrift庫。
而在baidu-std協(xié)議的實現(xiàn)上,吞吐和長尾在大部分場景下依然是srpc更優(yōu)。且由于workflow支持Windows(同機(jī)性能比linux快20%),所以這等同于用戶得以在Windows下使用brpc。還有一點值得一提的是,同樣是支持protobuf的RPC框架,由于srpc實現(xiàn)了部分IDL解析和代碼生成,接口形式無需受protobuf原始限制,因而所提供的接口比brpc更為簡潔,以server的rpc接口為例:
一個通用、易擴(kuò)展的RPC框架
除了支持binary傳輸,還支持HTTP+json和HTTP+binary的傳輸方式,業(yè)務(wù)可以借用HTTP實現(xiàn)跨語言,而傳輸本身對業(yè)務(wù)透明。這是除了上述介紹的協(xié)議層和接口描述文件層以外,srpc的另外一個重要層次。其中傳輸方式和協(xié)議層還可以互相結(jié)合,如果接收方為任何一種協(xié)議+HTTP作傳輸?shù)膕erver,則用戶都可以對其輕松地發(fā)送一個如下請求:
srpc內(nèi)部實現(xiàn)層次精巧,非常注重縱向?qū)哟尾鸱趾蜋M向解耦。其中壓縮層、序列化層、協(xié)議層是互相解耦的,利用函數(shù)重載、派生子類實現(xiàn)父類接口和模版特化等多種多態(tài)方式,來實現(xiàn)內(nèi)部使用同一套代碼的高度復(fù)用。后續(xù)架構(gòu)升級或者用戶進(jìn)行二次開發(fā),無論是中間再加一層、還是某層內(nèi)橫向添加一種內(nèi)容,都不需要改動現(xiàn)有的代碼,十分方便。
一個打通了Workfflow、功能更強(qiáng)大的任務(wù)流RPC
任務(wù)流是Workflow 在設(shè)計之初就引入的概念,其可將資源高度封裝,用戶可不用關(guān)心內(nèi)部細(xì)節(jié)、不接觸到連接池、線程池,僅需要了解業(yè)務(wù)關(guān)系就能實現(xiàn)復(fù)雜的業(yè)務(wù)邏輯。srpc除了提供同步、半同步接口外,其異步接口可以利用Context拿到Series來打通Workflow 任務(wù)流,這就意味著srpc可以把RPC調(diào)用當(dāng)作任務(wù)流來組建。
srpc還可以使用Workflow 自帶的其他功能,一方面是服務(wù)治理。Workflow 的upstream是本進(jìn)程內(nèi)把一批機(jī)器綁定到一個域名下,自帶多種方式的負(fù)載均衡和熔斷恢復(fù)等機(jī)制,srpc的client對應(yīng)的是一個ip,或者一個帶本地服務(wù)治理的集群,直接可以使用負(fù)載均衡和熔斷恢復(fù)等機(jī)制。
另一方面,srpc 還可以調(diào)用 Workflow 其他資源。RPC只是網(wǎng)絡(luò)資源,而Workflow 包含了如計算調(diào)度和異步文件IO等資源,還有目前已經(jīng)實現(xiàn)的多種常用網(wǎng)絡(luò)協(xié)議(包括HTTP、Redis、MySQL、Kafka),這些都可以為srpc所用。
srpc目前在搜狗搜索和搜狐集團(tuán)團(tuán)隊中多個線上業(yè)務(wù)已經(jīng)穩(wěn)定使用一段時間,由于接口簡介易上手,且直接打通workflow的任務(wù)流、計算調(diào)度、服務(wù)治理等功能, 因此對開發(fā)效率有非常大的提升。但srpc相對來說也是一個很年輕且代碼量不多(約一萬行)的項目,搜狗后續(xù)還會持續(xù)推進(jìn)其生態(tài)建設(shè),有信心為不同的RPC開發(fā)場景提供更加全面的解決方案。