当前位置: 首页 > 科技观察

搜狗开源通用C++RPC框架srpc

时间:2023-03-20 16:47:55 科技观察

今年7月底,搜狗开源了其内部工业级C++服务器引擎Workflow。现在,搜狗宣布开源Workflow生态项目——srpc,一个基于Workflow的轻量级RPC框架。性能更好的thrift/brpcsrpc和thrift/brpc都是协议和IDL可互操作的。srpc除了自带sogou-std协议外,还实现了baidu-std协议和thriftframed协议,所以srpc可以和thrift或者brpc(连接池方式)进行通信。此外,接口描述文件支持protobuf和thrift,这意味着用户不仅可以一键迁移基于protobuf或thrift的项目作为IDL,还可以使用srpc作为性能更好的thrift框架或brpc框架。与thrift相比,srpc实现的thriftframedprotocol在吞吐量和长尾性能上远超thriftnativeframework。并且srpc实现了对thrift接口描述文件的解析和代码生成,所以用户在srpc上使用thriftIDL时不需要依赖thrift库。在baidu-std协议的实现上,吞吐量和长尾在大部分场景下还是优于srpc的。并且因为workflow支持windows(同机性能比linux快20%),这相当于用户可以在windows下使用brpc。还有一点值得一提的是,它也是一个支持protobuf的RPC框架。由于srpc实现了部分IDL解析和代码生成,接口形式不需要受限于原来的protobuf,所以提供的接口比brpc更简洁。以rpc接口为例:一个通用且易于扩展的RPC框架除了支持二进制传输外,还支持HTTP+json和HTTP+binary传输方式。业务可以使用HTTP实现跨语言,传输本身对业务是透明的。这是srpc除了上面介绍的协议层和接口描述文件层之外的另一个重要层。其中,传输方式和协议层也可以相互结合。如果接收端使用任何协议+HTTP作为服务端进行传输,用户可以很方便的发送一个请求,如下:点与横向解耦。其中,压缩层、序列化层、协议层相互解耦,通过函数重载、派生子类实现父类接口、模板特化等多种多态方式实现同??一套数据集的高复用。内部代码。后续架构升级或者用户二次开发,无论是在中间加一层,还是在某一层横向加一个内容,都不需要改动已有的代码,非常方便。通过Workflow实现更强大的任务流RPC任务流是Workflow在设计之初就引入的概念。它可以高度封装资源,用户无需关心内部细节,不接触连接池、线程池,只需要了解业务关系就可以实现复杂的业务逻辑。srpc的异步接口除了提供同步和半同步接口外,还可以使用Context获取Series来打通Workflow任务流,也就是说srpc可以使用RPC调用作为任务流来形成。srpc还可以使用Workflow自带的其他功能,一个是服务治理。Workflow的上游就是在这个过程中将一批机器绑定到一个域名上,有负载均衡,熔断回收等各种机制。srpc的client对应一个ip或者一个本地服务管理的cluster。可以直接使用负载均衡、断路器恢复等机制。另一方面,srpc也可以调用Workflow的其他资源。RPC只是一种网络资源,而Workflow包括计算调度、异步文件IO等资源,以及目前已经实现的多种常用网络协议(包括HTTP、Redis、MySQL、Kafka),所有这些可以被srpc使用。搜狗方面表示,目前srpc已经在搜狗搜索和搜狐集团团队的多个在线业务中稳定使用了一段时间。由于接口简单易用,直接对接工作流任务流、计算调度、服务治理等功能,大大提高了开发效率。不过团队也指出,srpc还是一个相对年轻的项目,代码量不多(约10000行),未来他们会继续推进其生态建设,为不同的RPC开发场景提供更全面的解决方案。