不久之前,搜狗开源了一个轻量级的 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