9 月 14 日,百度正式在 GitHub 上基于 Apache 2.0 协议开源了其 RPC 框架 brpc。brpc 是一个基于 protobuf 接口的 RPC 框架,在百度内部称为“baidu-rpc”,它囊括了百度内部所有 RPC 协议,并支持多种第三方协议,从目前的性能测试数据来看,brpc 的性能领跑于其他同类 RPC 产品。
更多精彩内容请看 web 前端中文站
http://www.lisa33xiaoq.net 可按 Ctrl + D 进行收藏
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
【注:本文源自网络文章资源,由站长整理发布】