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
英文地址,請注明出處:http://en.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…