bRPC简介

bRPC基础介绍。

什么是RPC?

互联网上的机器大都通过TCP/IP协议相互访问,但TCP/IP只是往远端发送了一段二进制数据,为了建立服务还有很多问题需要抽象:

  • 数据以什么格式传输?不同机器间,网络间可能是不同的字节序,直接传输内存数据显然是不合适的;随着业务变化,数据字段往往要增加或删减,怎么兼容前后不同版本的格式?
  • 一个TCP连接可以被多个请求复用以减少开销么?多个请求可以同时发往一个TCP连接么?
  • 如何管理和访问很多机器?
  • 连接断开时应该干什么?
  • 万一server不发送回复怎么办?

RPC可以解决这些问题,它把网络交互类比为“client访问server上的函数”:client向server发送request后开始等待,直到server收到、处理、回复client后,client又再度恢复并根据response做出反应。

rpc.png

我们来看看上面的一些问题是如何解决的:

  • 数据需要序列化,protobuf在这方面做的不错。用户填写protobuf::Message类型的request,RPC结束后,从同为protobuf::Message类型的response中取出结果。protobuf有较好的前后兼容性,方便业务调整字段。http广泛使用json作为序列化方法。
  • 用户无需关心连接如何建立,但可以选择不同的连接方式:短连接,连接池,单连接。
  • 大量机器一般通过命名服务被发现,可基于DNS, ZooKeeper, etcd等实现。在百度内,我们使用BNS (Baidu Naming Service)。brpc也提供“list://“和"file://”。用户可以指定负载均衡算法,让RPC每次选出一台机器发送请求,包括: round-robin, randomized, consistent-hashing(murmurhash3 or md5)和 locality-aware.
  • 连接断开时可以重试。
  • 如果server没有在给定时间内回复,client会返回超时错误。

哪里可以使用RPC?

几乎所有的网络交互。

RPC不是万能的抽象,否则我们也不需要TCP/IP这一层了。但是在我们绝大部分的网络交互中,RPC既能解决问题,又能隔离更底层的网络问题。

对于RPC常见的质疑有:

  • 我的数据非常大,用protobuf序列化太慢了。首先这可能是个伪命题,你得用profiler证明慢了才是真的慢,其次很多协议支持携带二进制数据以绕过序列化。
  • 我传输的是流数据,RPC表达不了。事实上brpc中很多协议支持传递流式数据,包括http中的ProgressiveReader, h2的streams, streaming rpc, 和专门的流式协议RTMP。
  • 我的场景不需要回复。简单推理可知,你的场景中请求可丢可不丢,可处理也可不处理,因为client总是无法感知,你真的确认这是OK的?即使场景真的不需要,我们仍然建议用最小的结构体回复,因为这不大会是瓶颈,并且追查复杂bug时可能是很有价值的线索。

什么是brpc?

brpc

brpc是用c++语言编写的工业级RPC框架,常用于搜索、存储、机器学习、广告、推荐等高性能系统。

你可以使用它:

  • 搭建能在一个端口支持多协议的服务, 或访问各种服务
    • restful http/https, h2/gRPC。使用brpc的http实现比libcurl方便多了。从其他语言通过HTTP/h2+json访问基于protobuf的协议.
    • redis和memcached, 线程安全,比官方client更方便。
    • rtmp/flv/hls, 可用于搭建流媒体服务.
    • hadoop_rpc(可能开源)
    • 支持rdma(即将开源)
    • 支持thrift , 线程安全,比官方client更方便
    • 各种百度内使用的协议: baidu_std, streaming_rpc, hulu_pbrpc, sofa_pbrpc, nova_pbrpc, public_pbrpc, ubrpc和使用nshead的各种协议.
    • 基于工业级的RAFT算法实现搭建高可用分布式系统,已在braft开源。
  • Server能同步或异步处理请求。
  • Client支持同步、异步、半同步,或使用组合channels简化复杂的分库或并发访问。
  • 通过http界面调试服务, 使用cpu, heap, contention profilers.
  • 获得更好的延时和吞吐.
  • 把你组织中使用的协议快速地加入brpc,或定制各类组件, 包括命名服务 (dns, zk, etcd), 负载均衡 (rr, random, consistent hashing)

brpc的优势

更友好的接口

只有三个(主要的)用户类: Server, Channel, Controller, 分别对应server端,client端,参数集合. 你不必推敲诸如"如何初始化XXXManager”, “如何组合各种组件”, “XXXController的XXXContext间的关系是什么”。要做的很简单:

  • 建服务? 包含brpc/server.h并参考注释或示例.
  • 访问服务? 包含brpc/channel.h并参考注释或示例.
  • 调整参数? 看看brpc/controller.h. 注意这个类是Server和Channel共用的,分成了三段,分别标记为Client-side, Server-side和Both-side methods。

我们尝试让事情变得更加简单,以命名服务为例,在其他RPC实现中,你也许需要复制一长段晦涩的代码才可使用,而在brpc中访问BNS可以这么写"bns://node-name",DNS是"http://domain-name",本地文件列表是"file:///home/work/server.list",相信不用解释,你也能明白这些代表什么。

使服务更加可靠

brpc在百度内被广泛使用:

  • map-reduce服务和table存储
  • 高性能计算和模型训练
  • 各种索引和排序服务
  • ….

它是一个经历过考验的实现。

brpc特别重视开发和维护效率, 你可以通过浏览器或curl查看server内部状态, 分析在线服务的cpu热点, 内存分配和锁竞争, 通过bvar统计各种指标并通过/vars查看。

更好的延时和吞吐

虽然大部分RPC实现都声称“高性能”,但数字仅仅是数字,要在广泛的场景中做到高性能仍是困难的。为了统一百度内的通信架构,brpc在性能方面比其他RPC走得更深。

  • 对不同客户端请求的读取和解析是完全并发的,用户也不用区分”IO线程“和”处理线程"。其他实现往往会区分“IO线程”和“处理线程”,并把fd(对应一个客户端)散列到IO线程中去。当一个IO线程在读取其中的fd时,同一个线程中的fd都无法得到处理。当一些解析变慢时,比如特别大的protobuf message,同一个IO线程中的其他fd都遭殃了。虽然不同IO线程间的fd是并发的,但你不太可能开太多IO线程,因为这类线程的事情很少,大部分时候都是闲着的。如果有10个IO线程,一个fd能影响到的”其他fd“仍有相当大的比例(10个即10%,而工业级在线检索要求99.99%以上的可用性)。这个问题在fd没有均匀地分布在IO线程中,或在多租户(multi-tenancy)环境中会更加恶化。在brpc中,对不同fd的读取是完全并发的,对同一个fd中不同消息的解析也是并发的。解析一个特别大的protobuf message不会影响同一个客户端的其他消息,更不用提其他客户端的消息了。更多细节看这里。
  • 对同一fd和不同fd的写出是高度并发的。当多个线程都要对一个fd写出时(常见于单连接),第一个线程会直接在原线程写出,其他线程会以wait-free的方式托付自己的写请求,多个线程在高度竞争下仍可以在1秒内对同一个fd写入500万个16字节的消息。更多细节看这里。
  • 尽量少的锁。高QPS服务可以充分利用一台机器的CPU。比如为处理请求创建bthread, 设置超时, 根据回复找到RPC上下文, 记录性能计数器都是高度并发的。即使服务的QPS超过50万,用户也很少在contention profiler中看到框架造成的锁竞争。
  • 服务器线程数自动调节。传统的服务器需要根据下游延时的调整自身的线程数,否则吞吐可能会受影响。在brpc中,每个请求均运行在新建立的bthread中,请求结束后线程就结束了,所以天然会根据负载自动调节线程数。

brpc和其他实现的性能对比见这里。


这里转载分享brpc的官方介绍,方便自己学习查看

官方连接:bRPChttps://brpc.apache.org/zh/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913120.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣网C语言编程题:在数组中查找目标值位置之二分查找法

一. 简介 上一篇文章对力扣网上"有序数组中查找目标值范围"题目进行了普通的解法。文章如下: 力扣网C语言编程题:在数组中查找目标值位置之暴力解法-CSDN博客 本文使用二分查找法进行实现,因为二分查找法符合题目要求&#xff0…

前端查询条件加密传输方案(SM2加解密)

一、需求背景 控台项目甲方进行安全测试,测试报告其中一条:敏感信息明文传输 1 敏感信息明文传输 中危 查询接口传输手机号、银行卡号等敏感信息时未加密/脱敏处理。 二、解决方案 讨论出的方案是通过前端查询条件加密,后端对加密的…

【Python】Flask网页

Flask第三方库安装命令:pip install flask代码:from flask import Flask app Flask(__name__)app.route("/") def hello():return "Hello world!"if __name__ "__main__":app.run()其中的"Hello world!"可以改…

数字资产革命中的信任之锚:RWA法律架构的隐形密码

首席数据官高鹏团队律师创作,AI辅助 在数字经济的浪潮中,资产的边界正在被重新定义。当一块地产、一笔应收账款、甚至一份碳配额被转化为链上的数字代币时,技术的光芒固然耀眼,但真正决定其生命力的,是背后隐匿的“信…

mobaxterm终端sqlplus乱码问题解决

背景。使用mobaxterm终端连接linux。在查询数据库表注释时发现**?**中文乱码。影响对表的分析。完成以下三个编码设置再打开sqlplus查询含中文的数据就正常了 总结。需要查看sqlplus的编码是什么 SELECT parameter, value FROM nls_database_parameters WHERE pa…

一个简单的分布式追踪系统

1. 准备工作 导入必要的库 import contextvars import time from typing import Any, Optional, Dict, List, Union from dataclasses import dataclass, field2. 定义上下文变量 # 定义两个上下文变量,存储当前 Span 和 Trace _current_span: contextvars.Conte…

【Qt】事件处理、事件分发器、事件过滤器

事件处理 一. 事件事件处理鼠标事件处理按键事件处理定时器事件处理窗口事件处理 二. 事件分发器三. 事件过滤器 虽然 Qt 是跨平台的 C 开发框架,Qt 的很多能力其实是操作系统提供的,只不过 Qt 封装了系统 API,程序是运行在操作系统上的&…

广东省省考备考(第三十八天7.4)——言语理解:逻辑填空(题目训练)

错题解析 本题可从第二空入手,横线处搭配“理论”,且根据“使得”可知,横线处与前文构成因果关系,即“遗传学的空白和古生物证据的缺乏”导致他的理论在某些方面存在不足,A项“捉襟见肘”指拉一拉衣襟,就露…

5G网络切片技术

5G中的网络切片技术是一种通过虚拟化将单一物理网络划分为多个独立、可定制的虚拟网络的技术,旨在满足不同应用场景对网络性能、带宽、时延等需求的差异化要求。以下从技术原理、核心价值、应用场景、实现方式及未来趋势五个维度展开分析:一、技术原理&a…

算法学习笔记:7.Dijkstra 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题

在计算机科学领域,图论算法一直占据着重要地位,其中 Dijkstra 算法作为求解单源最短路径问题的经典算法,被广泛应用于路径规划、网络路由等多个场景。无论是算法竞赛、实际项目开发,还是计算机考研 408 的备考,Dijkstr…

汇编 函数调用栈

前言 网上很多对函数栈的解释,说的不是很清楚感觉,尤其是对到底是谁的栈,以及指令的微小但是很致命的细节没说,特写本文,一是帮助自己记忆,二是为了帮助大家,如有疏忽错误请指正。 核心概念 首先…

基于Apache MINA SSHD配置及应用

Apache MINA SSHD 是一个基于 Java 的 SSH 服务器和客户端实现,它是 Apache MINA 项目的一部分,提供了完整的 SSH 协议支持。 主要特性 SSH 协议支持: 支持 SSH2 协议 兼容大多数 SSH 客户端 支持多种加密算法和密钥交换方法 服务器功能…

Excel 如何让数据自动按要求排序或筛选?

让数据按要求排序和筛选是Excel数据处理的基础核心功能,也是进行有效分析前必做的准备工作。下面我们分开讲解这两个功能。 一、排序 (Sort):让数据井井有条 排序的目的是重新排列数据行的顺序,以便更好地观察和比较。 1. 快速单列排序 (最…

Django 安装使用教程

一、Django 简介 Django 是一个高级 Python Web 框架,鼓励快速开发和简洁实用的设计。它内置 ORM、认证系统、后台管理、表单处理、路由控制等功能,广泛用于开发企业级网站、内容管理系统、电商平台等。 二、环境准备 2.1 安装 Python Django 基于 Py…

前沿交叉:Fluent与深度学习驱动的流体力学计算体系

基础模块 流体力学方程求解 1、不可压缩N-S方程数值解法(有限差分/有限元/伪谱法) Fluent工业级应用:稳态/瞬态流、两相流仿真(圆柱绕流、入水问题) Tecplot流场可视化与数据导出 2、CFD数据的AI预处理 基于P…

五、Flutter动画

目录1. Flutter 中动画的基本概念是什么?2. 解释 AnimationController 和 Tween 的作用3. 如何实现一个补间(Tween)动画?4. 什么是隐式动画?举例说明5. 如何实现自定义复杂动画?1. Flutter 中动画的基本概念…

全网唯一/Qt结合ffmpeg实现手机端采集摄像头推流到rtsp或rtmp/可切换前置后置摄像头/指定分辨率帧率

一、前言说明 之前已经实现了Qt结合ffmpeg在安卓上运行,所有在win上的功能,在安卓上都已经实现,比如编码保存到MP4文件,正常解码音视频文件播放等,唯独还差一个功能,尽管用的不多,但是还是有一…

Install Ubuntu 24.04 System

1.制作安装镜像盘(U盘) 下载rufus制作工具(网址:https://www.xiaomoxz.com/nexus/bi1/rufus4.shtml?bd_vid8643969197265870719) 2. 设置U盘启动: F2进入BIOS 3. Install Ubuntu 24.04 Ubuntu下载地址:…

solidjs 处理复杂类型的响应式

solidjs 处理复杂类型的响应式 在 solidjs 里响应式一般直接用 createSignal 就可以,但 createSignal 一般用于基础数据类型。 虽然复杂类型也是可以使用,但基于起细粒度响应性的特性。 一般复杂的数据使用 createSignal 就不是那么友好了。 所以 cre…

爬虫技术-获取浏览器身份认证信息(如 Cookie、Token、Session 等)

方法一:通过浏览器开发者工具查看和提取 Cookie / Token 📌 示例场景: 你在使用一个网站时已经登录了,想看看这个网站是如何保存你的身份凭证的。 🔧 操作过程: 打开浏览器(例如 Chrome&#xf…