9 月 14 日,百度正式在 GitHub 上基于 Apache 2.0 协议开源了其 RPC 框架 brpc。brpc 是一个基于 protobuf 接口的 RPC 框架,在百度内部称为“baidu-rpc”,它囊括了百度内部所有 RPC 协议,并支持多种第三方协议,从目前的性能测试数据来看,brpc 的性能领跑于其他同类 RPC 产品。
brpc 类似于阿里的 dubbo,腾讯的 tars。
brpc 开发于 2014 年,主要使用的语言是 C++ 和 Java,是百度内部使用最为广泛的 RPC 框架,它经受了高并发高负载的生产环境验证,并支撑了百度内部大约 75 万个同时在线的实例。
brpc 在百度中使用的最常见的RPC框架,拥有60万个实例和500多种服务,在百度之内称为“baidu-rpc”。
什么是RPC?
互联网上的大多数机器通过TCP / IP互相通信。然而,TCP/IP只保证可靠的数据传输,我们需要抽象更多的来构建服务:
- 数据传输的格式是什么?不同的机器和网络可能有不同的字节顺序,直接发送内存中的数据是不合适的。数据中的字段逐渐添加,修改或删除,新服务如何与较旧的服务进行交流?
- TCP连接可以重用于多个请求以减少开销吗?多个请求可以通过一个TCP连接同时发送吗?
- 如何与许多机器的集群谈话?
- 当连接断开时应该怎么办?如果服务器没有响应怎么办?
RPC通过将网络通信抽象为“服务器上的客户端访问功能”来解决上述问题:客户端向服务器发送请求,等到服务器接收到 – >进程 – >响应请求,然后根据结果执行操作。
让我们看看问题如何解决。
- RPC需要由protobuf完成的序列化。用户以protobuf :: Message的格式填写请求,做RPC,并在protobuf :: Message中从响应中获取结果。protobuf具有良好的前向和后向兼容性,用户可以逐步更改字段和构建服务。对于http服务,json用于广泛的序列化。
- 连接的建立和重新使用对于用户是透明的,但是用户可以做出选择,说出不同的连接类型:短,池,单。
- 机器被命名服务,可以通过执行发现的DNS, ZooKeeper or etcd。在百度里面,我们使用BNS(百度命名服务)。brpc也提供了“list://”和“file://”。用户指定负载均衡算法为所有机器的每个请求选择一台机器,包括:循环,随机,一致的哈希(murmurhash3或md5)和本地化感知。
- 当连接断开时,RPC重试。当服务器在给定的时间内没有响应时,客户端失败,超时错误。
哪里场景可以使用RPC?
几乎所有的网络通信。
RPC无法做到一切,否则我们不需要TCP / IP层。但是在大多数网络通信中,RPC满足要求并隔离底层细节。
RPC常见疑问:
- 我的数据是二进制的,使用protobuf很慢。首先这可能是一个错误的感觉,你必须用剖析器证明它,第二个许多协议支持携带二进制数据以及protobuf请求,并绕过序列化。
- 我正在发送不能由RPC处理的流数据。实际上,RPC中的许多协议可以处理流数据,包括http中的ProgressiveReader,h2中的流,流rpc和作为专用流协议的RTMP。
- 我不需要回复 有了一些引导,我们知道,在您的场景中,请求可以在任何阶段丢弃,因为客户端始终不了解情况。你真的确定这是可以接受的吗?即使您不需要回复,我们建议您发回小尺寸的回复,这些回复是不太可能的性能瓶颈,并且在调试复杂的错误时可能是有价值的线索。
brpc 是什么?
在百度中使用的RPC框架遍布百度,其中有600,000多个实例(不包括客户端)和500多种服务,在百度中称为“ 百度rpc ”。现在只有C ++实现被打开了。
您可以使用它:
-
构建可以在多个协议(在同一端口)上进行通话或者访问各种服务的服务器
- 安静的http / https,h2 / h2c(兼容grpc,将很快被打开)。在brpc中使用http比libcurl更友好。
- redis和memcached,线程安全,比官方客户更友善和更好
- rtmp / flv / hls,用于构建实时流服务。
- hadoop_rpc(尚未打开)
- 通过openucx支持rdma(即将开放)
- 百度使用的各种协议:baidu_std,streaming_rpc,hulu_pbrpc,sofa_pbrpc,nova_pbrpc,public_pbrpc,ubrpc和基于nshead的协议。
- 使用HTTP + json访问基于protobuf的协议,可能来自另一种语言。
- 使用RAFT协商一致的算法构建分布式服务(将在快速启动时启用)
-
丰富的处理模式
- 服务可以同步或异步处理请求。
- 同步或异步访问服务,甚至半同步访问。
- 使用组合通道以声明方式简化复杂的客户端模式,包括分片和并行访问。
- 通过http调试服务,并运行 cpu,堆和争用分析器。
- 获得更好的延迟和吞吐量。
- 使用您组织中使用的协议快速扩展brpc,或自定义组件,包括命名服务(dns,zk,etcd),负载均衡器(rr,random,一致散列)
参考资料
- https://github.com/brpc/brpc
: » 百度 RPC 框架 brpc 简介
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/tech/java/251676.html