百度开源RPC框架,拥有60万个实例和500多种服务!
bigegpt 2024-10-10 04:40 14 浏览
在百度中使用的最常见的RPC框架,拥有60万个实例和500多种服务,在百度之内称为“百度rpc”。
什么是RPC?
互联网上的大多数机器通过TCP/IP通信。然而,TCP/IP仅保证可靠的数据传输。我们需要抽象更多来构建服务:
数据传输的格式是什么?不同的机器和网络可能有不同的字节顺序,直接发送内存中的数据是不合适的。数据中的字段逐渐添加,修改或删除,新服务如何与较旧的服务进行交流?
TCP连接可以重用于多个请求以减少开销吗?多个请求可以通过一个TCP连接同时发送吗?
如何与许多机器的集群对话?
当连接断开时应该怎么办?如果服务器没有响应怎么办?
RPC通过将网络通信抽象为“客户端访问服务器功能”来解决上述问题:客户端向服务器发送请求,等待服务器接收到->进程->响应请求,然后根据结果执行操作。
让我们看看问题如何解决。
RPC需要由protobuf完成序列化。用户以protobuf :: Message,RPC格式填写请求,并在protobuf :: Message中从响应中获取结果。protobuf具有良好的前向和后向兼容性,用户可以逐步更改字段和构建服务。对于http服务,json用于广泛的序列化。
连接的建立和重新使用对于用户来说是透明的,但是用户可以选择不同的连接类型:简单的,合并的,单一的。
机器由命名服务发现,可以由DNS,ZooKeeper等实现。在百度里面,使用BNS(百度命名服务)。brpc也提供了“list://”和“file://”。用户指定负载均衡算法为所有机器的每个请求选择一台机器,包括:循环,随机,一致的哈希(murmurhash3或md5)和本地化感知。
当连接断开时,RPC重试。当服务器在给定的时间内没有响应时,客户端会失败并出现超时错误。
我在哪里可以使用RPC?
几乎所有的网络通信。RPC无法做到一切,否则我们不需要TCP/IP层。但是在大多数网络通信中,RPC满足要求并隔离底层细节。
RPC常见疑问:
我的数据是二进制的,使用protobuf将会很慢。首先,这可能是一个错误的感觉,你将不得不测试它并用分析器证明它。第二,许多协议支持携带二进制数据以及protobuf请求并绕过序列化。
我正在发送无法由RPC处理的流数据。实际上,RPC中的许多协议可以处理流数据,包括http中的ProgressiveReader,h2中的流,流rpc和作为专用流协议的RTMP。
什么是brpc?
在百度中使用的RPC框架遍布百度,其中有600000多个实例(不包括客户端)和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,堆和contention profilers.。
获得更好的延迟和吞吐量。
使用你企业中使用的协议快速扩展brpc,或自定义组件,包括命名服务(dns,zk,etcd),负载均衡(rr,random,一致散列)
brpc的优点:
更友善的API
只有3个(主要)用户头:服务器,通道,控制器,分别对应于服务器端,客户端和参数集。你不必担心“如何初始化XXXManager”,“如何将所有这些组件层叠在一起”,“XXXController和XXXContext之间的关系是什么”。所有你需要做的很简单:
建立服务?包括brpc / server.h并遵循评论或示例。
访问服务?包括brpc / channel.h并遵循评论或示例。
调整参数?结帐brpc / controller.h。请注意,该类由服务器和通道共享。方法分为客户端,服务器端和双方三部分。
我们试图简单地做简单的事情。以命名服务为例。在较旧的RPC实现中,你可能需要复制一堆模糊的代码才能使其工作,但是在brpc访问中,BNS表示为Init(“bns:// node-name”...,DNS is“http://域名“和本地机器列表是”file:///home/work/server.list“。没有任何解释,你知道这是什么意思。
使服务更可靠
brpc广泛应用于百度,从:
map-reduce服务和表存储
高性能计算和模型培训
各种索引和排名服务器
已经证明了。brpc特别注意开发和维护效率,你可以查看Web浏览器中的服务器内部状态或卷,你可以在线分析cpu使用情况,堆分配和锁定服务争用,可以通过bvar测量统计信息,in /vars.
更好的延迟和吞吐量
虽然几乎所有的RPC实现都声称它们是“高性能”的,但数字可能只是数字。在不同场景中真正的高绩效是困难的。为了统一百度之内的通信,brpc在性能上比其他实现更深入。
读取和解析来自不同客户端的请求完全并行化,用户不需要区分“IO线程”和“处理线程”。其他实现可能具有“IO线程”和“处理线程”以及散列文件描述符(fd)到IO线程中。当IO线程处理其中一个fds时,线程中的其他fds将无法处理。如果一个消息很大,其他fds会显着延迟。虽然不同的IO线程并行运行,但是你不会有许多IO线程,因为除了从fds读取/解析之外,它们不需要太多的操作。如果有10个IO线程,则fd可能会影响所有fds的10%,这对于工业在线服务是不可接受的(需要99.99%的可用性)。当fds不均匀地分布在IO线程(不幸的是常见的),或者服务是多租户(在云服务中常见)时,问题会更糟。在brpc中,从不同的fds读取并行化,甚至处理来自一个fd的不同消息也被并行化。解析大的消息不会阻止来自同一个fd的其他消息,更不用说其他fds。
写入一个fd和多个fds是高并发的。当多个线程写入相同的fd(通用于多路复用连接)时,第一个线程直接写入就绪,其他线程以等待方式提交写请求。一对fd可以通过几个高度对抗的线程每秒写入5000000个16字节的消息。
最小的锁。高QPS服务可以利用机器上的所有CPU电源。例如,创建用于处理请求的bthread,设置超时,根据响应查找RPC上下文,记录性能计数器都是高并发的。即使服务运行在五十万以上QPS,用户也看到RPC框架引起的contentions(通过contention profiler)。
服务器根据负载调整线程号。传统实现根据延迟设置线程数以避免限制吞吐量。brpc为每个请求创建一个新的bthread,并在请求完成时结束bthread,根据加载自动调整线程号。
百度brpc开源库:https://github.com/brpc/brpc
检查基准测试以比较brpc和其他实现:https://github.com/brpc/brpc/blob/master/docs/cn/benchmark.md
相关推荐
- Go语言泛型-泛型约束与实践(go1.7泛型)
-
来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...
- golang总结(golang实战教程)
-
基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...
- Go 官宣:新版 Protobuf API(go pro版本)
-
原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...
- Golang开发的一些注意事项(一)(golang入门项目)
-
1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...
- golang 托盘菜单应用及打开系统默认浏览器
-
之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...
- golang标准库每日一库之 io/ioutil
-
一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...
- 文件类型更改器——GoLang 中的 CLI 工具
-
我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...
- Go (Golang) 中的 Channels 简介(golang channel长度和容量)
-
这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...
- Golang引入泛型:Go将Interface「」替换为“Any”
-
现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...
- 一文带你看懂Golang最新特性(golang2.0特性)
-
作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...
- Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移
-
以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...
- Golang使用grpc详解(golang gcc)
-
gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...
- Etcd服务注册与发现封装实现--golang
-
服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...
- Golang:将日志以Json格式输出到Kafka
-
在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...
- 如何从 PHP 过渡到 Golang?(php转golang)
-
我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- linux安装minio (74)
- ubuntuunzip (67)
- vscode使用技巧 (83)
- secure-file-priv (67)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)