遍布百度技术架构的通信rpc框架开源了,叫板谷歌?
ccwgpt 2024-10-16 07:58 35 浏览 0 评论
在百度中使用的最常见的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
相关推荐
- RACI矩阵:项目管理中的角色与责任分配利器
-
作者:赵小燕RACI矩阵RACI矩阵是项目管理中的一种重要工具,旨在明确团队在各个任务中的角色和职责。通过将每个角色划分为负责人、最终责任人、咨询人和知情人四种类型,RACI矩阵确保每个人都清楚自己...
- 在弱矩阵组织中,如何做好项目管理工作?「慕哲制图」
-
慕哲出品必属精品系列在弱矩阵组织中,如何做好项目管理工作?【慕哲制图】-------------------------------慕哲制图系列0:一图掌握项目、项目集、项目组合、P2、商业分析和NP...
- Scrum模式:每日站会(Daily Scrum)
-
定义每日站会(DailyScrum)是一个Scrum团队在进行Sprint期间的日常会议。这个会议的主要目的是为了应对Sprint计划中的不断变化,确保团队能够有效应对挑战并达成Sprint目标。为...
- 大家都在谈论的敏捷开发&Scrum,到底是什么?
-
敏捷开发作为一种开发模式,近年来深受研发团队欢迎,与瀑布式开发相比,敏捷开发更轻量,灵活性更高,在当下多变环境下,越来越多团队选择敏捷开发。什么是敏捷?敏捷是一种在不确定和变化的环境中,通过创造和响应...
- 敏捷与Scrum是什么?(scrum敏捷开发是什么)
-
敏捷是一种思维模式和哲学,它描述了敏捷宣言中的一系列原则。另一方面,Scrum是一个框架,规定了实现这种思维方式的角色,事件,工件和规则/指南。换句话说,敏捷是思维方式,Scrum是规定实施敏捷哲学的...
- 敏捷项目管理与敏捷:Scrum流程图一览
-
敏捷开发中的Scrum流程通常可以用一个简单的流程图来表示,以便更清晰地展示Scrum框架的各个阶段和活动。以下是一个常见的Scrum流程图示例:这个流程图涵盖了Scrum框架的主要阶段和活动,其中包...
- Mockito 的最佳实践(mock方法)
-
记得以前面试的时候,面试官问我,平常开发过程中自己会不会测试?我回答当然会呀,自己写的代码怎么不测呢。现在想想我好像误会他的意思了,他应该是想问我关于单元测试,集成测试以及背后相关的知识,然而当时说到...
- EffectiveJava-5-枚举和注解(java枚举的作用与好处)
-
用enum代替int常量1.int枚举:引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式。int枚举模式是类型不安全的,例如下面两组常量:性别和动物种...
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
-
Maven简介Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。Maven是一个跨平台的项目管理工具。主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。仔...
- Java单元测试框架PowerMock学习(java单元测试是什么意思)
-
前言高德的技术大佬在谈论方法论时说到:“复杂的问题要简单化,简单的问题要深入化。”这句话让我感触颇深,这何尝不是一套编写代码的方法——把一个复杂逻辑拆分为许多简单逻辑,然后把每一个简单逻辑进行深入实现...
- Spring框架基础知识-第六节内容(Spring高级话题)
-
Spring高级话题SpringAware基本概念Spring的依赖注入的最大亮点是你所有的Bean对Spring容器的存在是没有意识的。但是在实际的项目中,你的Bean必须要意识到Spring容器...
- Java单元测试浅析(JUnit+Mockito)
-
作者:京东物流秦彪1.什么是单元测试(1)单元测试环节:测试过程按照阶段划分分为:单元测试、集成测试、系统测试、验收测试等。相关含义如下:1)单元测试:针对计算机程序模块进行输出正确性检验工作...
- 揭秘Java代码背后的质检双侠:JUnit与Mockito!
-
你有没有发现,现在我们用的手机App、逛的网站,甚至各种智能设备,功能越来越复杂,但用起来却越来越顺畅,很少遇到那种崩溃、卡顿的闹心事儿?这背后可不是程序员一拍脑袋写完代码就完事儿了!他们需要一套严谨...
- 单元测试框架哪家强?Junit来帮忙!
-
大家好,在前面的文章中,给大家介绍了以注解和XML的方式分别实现IOC和依赖注入。并且我们定义了一个测试类,通过测试类来获取到了容器中的Bean,具体的测试类定义如下:@Testpublicvoid...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)