深入解析Sogou SRPC框架:基于Workflow的高性能RPC实现
深入解析Sogou SRPC框架:基于Workflow的高性能RPC实现
前言
在现代分布式系统开发中,RPC(远程过程调用)框架扮演着至关重要的角色。本文将深入解析Sogou开源的SRPC框架,这是一个基于Workflow项目构建的高性能RPC实现,具有架构精巧、性能优异的特点。
一、SRPC框架概述
SRPC是搜狗公司基于Workflow项目开发的RPC框架,核心代码约1万行。它通过解析IDL(接口描述文件)并生成代码,实现了与Workflow底层通信框架的无缝对接,提供了简洁易用的用户接口。
核心设计理念
SRPC采用了纵向解耦、横向可扩展的架构设计,通过多种泛型编程方式实现了高度代码复用。这种设计使得:
- 新增中间层非常方便
- 各层内部可轻松扩展新功能
- 整体架构保持简洁优雅
二、SRPC架构层次解析
SRPC采用分层架构设计,各层职责明确且相互解耦:
1. 核心层次划分
- 用户代码层:包含客户端发送函数和服务端函数实现
- IDL序列化层:支持protobuf/thrift序列化
- 数据组织层:处理protobuf/thrift/json数据格式
- 压缩层:提供none/gzip/zlib/snappy/lz4等多种压缩算法
- 协议层:实现SRPC-std/BRPC-std/Thrift-framed/TRPC等协议
- 通信层:支持TCP/HTTP等传输协议
2. 层次间关系
各层次可以灵活组合,通过函数重载、子类继承和模板特化等多种多态方式实现代码复用。这种设计使得架构升级和功能扩展都非常便捷。
三、协议与通信实现
1. 协议设计
SRPC实现了多种RPC协议,其中SRPC-std协议结构如下:
| 魔数(4B) | 元数据长度(4B) | 元数据 | 请求/响应数据 |
元数据包含service和method信息,请求/响应数据则是完整的IDL内容。
2. 通信协议组合
SRPC支持协议层和通信层的灵活组合,目前已实现7种网络通信协议:
- SRPCStd/SRPCHttp
- BRPCStd
- TRPCStd/TRPCHttp
- ThriftBinaryFramed/ThriftBinaryHttp
这种组合能力使得SRPC可以同时支持二进制协议和HTTP协议,极大提高了框架的适用性。
四、代码生成机制
1. 代码生成必要性
SRPC通过代码生成来解决以下问题:
- 网络数据到结构体的反序列化
- 为用户提供结构体参数接口
- 简化用户接口复杂度
2. 生成代码示例
对于protobuf定义的service,SRPC生成的接口比原生protobuf接口更简洁:
// Server接口
class Service : public srpc::RPCService {
public:
virtual void Echo(EchoRequest *request, EchoResponse *response,
srpc::RPCContext *ctx) = 0;
};
// Client接口
class SRPCClient : public srpc::SRPCClient {
public:
void Echo(const EchoRequest *req, EchoDone done);
};
3. 多协议支持
SRPC为每种IDL生成对应的多协议客户端,例如protobuf IDL会生成:
class SRPCClient : public srpc::SRPCClient;
class SRPCHttpClient : public srpc::SRPCHttpClient;
class BRPCClient : public srpc::BRPCClient;
class TRPCClient : public srpc::TRPCClient;
五、调用接口设计
SRPC提供了丰富的调用接口,满足不同场景需求:
1. 异步接口
void Echo(const EchoRequest *req, EchoDone done);
2. 同步接口
void Echo(const EchoRequest *req, EchoResponse *resp,
srpc::RPCSyncContext *sync_ctx);
3. 半同步接口
WFFuture<std::pair<EchoResponse, srpc::RPCSyncContext>>
async_Echo(const EchoRequest *req);
4. Task接口
srpc::SRPCClientTask *task = SRPCClient::create_Echo_task(done);
task->serialize_input(req);
task->start();
六、与Workflow深度集成
1. 任务流集成
通过RPCContext可以获取SeriesWork,实现任务流串联:
// 异步Server示例
void Echo(EchoRequest *request, EchoResponse *response, RPCContext *ctx) {
auto *task = WFTaskFactory::create_timer_task(10, nullptr);
ctx->get_series()->push_back(task);
}
2. Workflow功能复用
SRPC可以充分利用Workflow的多种功能:
- 服务治理(upstream管理、负载均衡、熔断恢复)
- 超时和重试配置
- 计算和异步文件IO等系统资源
七、性能表现
SRPC在性能方面表现优异:
- 吞吐量优于brpc和apache thrift
- 长尾性能与brpc各有优势,但都优于thrift
- 已在搜狗内部和多个开源团队中稳定运行
八、总结
SRPC框架通过精巧的架构设计,实现了:
- 多层次解耦,各层可独立扩展
- 多协议支持,兼容性强
- 与Workflow深度集成,功能丰富
- 性能优异,接口简洁易用
这种设计使得SRPC既适合快速开发,又能满足高性能需求,是分布式系统开发的优秀选择。随着生态的不断完善,SRPC有望成为RPC领域的重要解决方案之一。
更多推荐



所有评论(0)