百日筑基第十九天-一頭扎進消息隊列2

百日筑基第十九天-一頭扎進消息隊列2

在這里插入圖片描述

消息隊列的通訊協議

目前業界的通信協議可以分為公有協議和私有協議兩種。公有協議指公開的受到認可的具有規 范的協議,比如 JMS、HTTP、STOMP 等。私有協議是指根據自身的功能和需求設計的協 議,一般不具備通用性,比如 Kafka、RocketMQ、Puslar 的協議都是私有協議。

大多數消息隊列為了自身的功能支持、迭代速度、靈活性考慮,在核心通信協議的選擇上 不會選擇公有協議,都會選擇自定義私有協議

從技術上來看,私有協議設計一般需要包含三個步驟。

  1. 網絡通信協議選型,指計算機七層網絡模型中的協議選擇。比如傳輸層的 TCP/UDP、應用 層的 HTTP/WebSocket 等。 從功能需求出發,為了保證性能和可靠性,幾乎所有主流消息隊列在核心生產、消費鏈路的協 議選擇上,都是基于可靠性高、長連接的 TCP 協議。
  2. 應用通信協議設計,指如何約定客戶端和服務端之間的通信規則。比如如何識別請求內容、 如何確定請求字段信息等。 從應用通信協議構成的角度,協議一般會包含**協議頭(數據源信息)和協議體(業務數據)**兩部分。
  3. 編解碼(序列化 / 反序列化)實現,用于將二進制的消息內容解析為程序可識別的數據格式(或反過來用于傳輸)。

消息隊列的網絡模塊

網絡模塊:對消息隊列來說,網絡模塊是核心組件之一,網絡模塊的性能很大程度上決定了消息傳輸的能力和整體性能。

消息隊列是需要滿足高吞吐、高可靠、低延時,并支持多語言訪問的基礎軟件,網絡模塊最需要解決的是性能、穩定性、開發成本三個問題。

從技術上來看,高性能網絡模塊的設計可以分為如何高效管理大量的 TCP 連接如何快速處理高并發的請求如何提高穩定性和降低開發成本等三個方面。

  1. 高效處理大量 TCP 連接:在消息隊列中主要有**單條 TCP 連接的復用(RabbitMQ)IO多路復用(Kakfa、RocketMQ、Pulsar )**兩種技術思路。
  2. 快速處理高并發的請求:Reactor 模型是一種處理并發服務請求的事件設計模式,當主流程收到請求后,通過多路分離處理的方式,把請求分發給相應的請求處理器處理。
  3. 提高穩定性和降低開發成本:在消息隊列的網絡編程模型中,為了提高穩定性或者降低成本,選擇現成的、成熟的 NIO 框架是一個更好的方案(kafka如是)。

消息隊列的存儲模塊

存儲模塊作為消息隊列高吞吐、低延時、高可靠特性的基礎保證,可以說是最核心的模塊。

消息隊列中的數據一般分為元數據消息數據。元數據是指 Topic、Group、User、ACL、Config 等集群維度的資源數據信息,消息數據指客戶端寫入的用戶的業務數據。

  1. 元數據信息的存儲:元數據信息的特點是數據量比較小,不會經常讀寫,但是需要保證數據的強一致和高可靠,不允許出現數據的丟失。基于第三方組件來實現元數據的存儲是目前業界的主流選擇。比如 Kafka ZooKeeper 版本、 Pulsar、RocketMQ 用的就是這個思路,其中 Kakfa 和 Pulsar 的元數據存儲在 ZooKeeper 中,RocketMQ 存儲在 NameServer 中。另一種思路,集群內部實現元數據的存儲是指在集群內部完成元數據的存儲和分發。也就是在 集群內部實現類似第三方組件一樣的元數據服務,比如基于 Raft 協議實現內部的元數據存儲 模塊或依賴一些內置的數據庫。目前 Kafka 去 ZooKeeper 的版本、RabbitMQ 的 Mnesia、 Kafka 的 C++ 版本 RedPanda 用的就是這個思路。

  2. 數據消息的存儲:第一個思路,每個分區對應一個文件的形式去存儲數據(kafka如是)。因為消息隊列在大部分情況下的讀寫是有序的,所以這種機制在讀寫性能上的表現是最高的。第二種思路,每個節點上所有分區的數據都存儲在同一個文件中,這種方案需要為每個分區維護一個對應的索引文件,索引文件里會記錄每條消息在 File 里面的位置信息,以便快速定位到具體的消息內容。(目前 RocketMQ、RabbitMQ 和 Pulsar 的底層存儲 BookKeeper 用的就是這個方案)

數據分段的規則一般是根據大小來進行的,比如默認 1G 一個文件,同時會支持配置項調整分段數據的大小。

從技術上來看,當數據段到達了規定的大小后,就會新創建一個新文件來保存數據。

如果進行了分段,消息數據可能分布在不同的文件中。所以我們在讀取數據的時候,就需要先 定位消息數據在哪個文件中。為了滿足這個需求,技術上一般有根據偏移量定位或根據索引定位兩種思路。

  1. 根據偏移量(Offset)來定位消息在哪個分段文件中,是指通過記錄每個數據段文件的起始偏 移量、中止偏移量、消息的偏移量信息,來快速定位消息在哪個文件。
  2. 如果用索引定位,會直接存儲消息對應的文件信息,而不是通過偏移量來定位到具體文件。(RabbitMQ 和 RocketMQ 如是)

消息數據存儲格式一般包含消息寫入文件的格式和消息內容的格式兩個方面。

  1. 消息寫入文件的格式指消息是以什么格式寫入到文件中的,比如 JSON 字符串或二進制。從 性能和空間冗余的角度來看,消息隊列中的數據基本都是以二進制的格式寫入到文件的。
  2. 消息內容的格式是指寫入到文件中的數據都包含哪些信息。對于一個成熟的消息隊列來說,消 息內容格式不僅關系功能維度的擴展,還牽涉性能維度的優化。(如Kafka 的消息內容包含了業務會感知到的消息的 Header、Key、Value,還包含了時間戳、偏移量、協議版本、數據長度和大小、校驗碼等基礎信息,最后還包含了壓縮、事 務、冪等 Kafka 業務相關的信息)

消息隊列中的數據最終都會刪除,時間周期短的話幾小時、甚至幾分鐘,正常情況一天、三 天、七天,長的話可能一個月,基本很少有場景需要在消息隊列中存儲一年的數據

消息隊列的數據過期機制一般有手動刪除和自動刪除兩種形式。從實現上看主要有三種思路: 消費完成執行 ACK 刪除、數據根據時間和保留大小刪除、 ACK 機制和過期機制相結合。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44445.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數學建模·熵權法

熵權法 一種計算評價指標之間權重的方法。熵權法是一種客觀的方法,沒有主觀性,比較可靠。 具體定義 熵權法的核心在于計算信息熵,信息熵反映了一個信息的紊亂程度,體現了信息的可靠性 具體步驟 Step1正向化處理 將所以評價指標轉…

智能家居裝修怎么布線?智能家居網絡與開關插座布置

打造全屋智能家居。計劃的智能家居方案以米家系列為主,智能家居聯網方案以無線為主。裝修前為了裝備智能家居做了很多準備工作,本文深圳僑杰智能分享一個智能家居裝修和布線方面的心得與實戰知識。希望能對大家的裝修有所幫助。 ?1.關于網絡 如果房子比…

HTML基本標簽(二)

HTML基本標簽&#xff08;二&#xff09; 表格標簽 table媒體元素audio 音頻vido 視頻 form 表單元素 表格標簽 table <!-- caption 代表表格標題相關屬性border 邊框cellpadding 設置單元格內填充cellspacing 設置單元格間空隙width 設置表格寬度&#xff0c;默認是內容撐…

Python-數據爬取(爬蟲)

~~~理性爬取~~~ 杜絕從入門到入獄 1.簡要描述一下Python爬蟲的工作原理&#xff0c;并介紹幾個常用的Python爬蟲庫。 Python爬蟲的工作原理 發送請求&#xff1a;爬蟲向目標網站發送HTTP請求&#xff0c;通常使用GET請求來獲取網頁內容。解析響應&#xff1a;接收并解析HTTP響…

結合實體類型信息1——基于本體的知識圖譜補全深度學習方法

1 引言 1.1 問題 目前KGC和KGE提案的兩個主要缺點是:(1)它們沒有利用本體信息;(二)對訓練時未見的事實和新鮮事物不能預測的。 1.2 解決方案 一種新的知識圖嵌入初始化方法。 1.3 結合的信息 知識庫中的實體向量表示&#xff0b;編碼后的本體信息——>增強 KGC 2基…

基于AT89C51單片機超聲波水位液位控制系統設計(含文檔、源碼與proteus仿真,以及系統詳細介紹)

本篇文章論述的是基于AT89C51單片機的1616點陣LED顯示器字符滾動顯示設計的詳情介紹&#xff0c;如果對您有幫助的話&#xff0c;還請關注一下哦&#xff0c;如果有資源方面的需要可以聯系我。 目錄 設計任務與要求 原理圖 仿真圖 代碼 系統論文 資源下載 設計任務與要求…

處理線程安全的列表CopyOnWriteArrayList 和Collections.synchronizedList

ConcurrentModificationException 是 Java 中的一種異常&#xff0c;用于指示在迭代集合時&#xff0c;該集合的結構發生了并發修改。 在 Java 中&#xff0c;許多集合類&#xff08;如 ArrayList, HashMap 等&#xff09;都不是線程安全的。如果一個線程在迭代集合的同時&…

IDEA的JAVA版本沒有8怎么辦

問題&#xff1a; 很多小伙伴會出現如下的情況&#xff0c;java的版本很高&#xff0c;沒有8 解決 更換IDEA內置的Server URL的鏡像地址 就是這個 把其中的地址換成 https://start.aliyun.com/ https://start.aliyun.com/ 我們可以看到JAVA 8就出現了

Vue Router 4:構建高效單頁面應用的路由管理

引言 Vue Router的重要性在于它極大地簡化了單頁面應用(SPA)的開發流程。通過Vue Router&#xff0c;開發者可以輕松地將URL映射到對應的組件&#xff0c;實現頁面的無刷新跳轉&#xff0c;從而提升用戶體驗。 安裝和設置Vue Router 4 如何在Vue 3項目中安裝Vue Router 4 1…

期貨量化交易客戶端開源教學第四節——交易接口協議

指令介紹: 01----09:服務端發送到客戶端指令 10----49:客戶端發送操作指令 50----59:客戶端與服務端通訊指令 60----99:股票接口與服務端交互指令 --------------------------------------------------- 02:商品行情 03:用戶信息接收 04:用戶資產信息接收 ----發送到…

SpringBoot的動態代理默認用的哪個???

在 Spring Boot 中&#xff0c;動態代理的默認實現方式取決于被代理的對象的類型和具體配置&#xff1a; JDK 動態代理&#xff1a; 當代理的對象實現了一個或多個接口時&#xff0c;Spring 默認使用 JDK 動態代理。JDK 動態代理只能代理實現了接口的類。 CGLIB 動態代理&…

Python-PLAXIS自動化建模技術與典型巖土工程案例

有限單元法在巖土工程問題中應用非常廣泛&#xff0c;很多軟件都采用有限單元解法。在使用各大軟件進行數值模擬建模的過程中&#xff0c;巖土工程中的各種問題&#xff08;塑性、滲流、固結、動力、穩定安全、熱力TM&#xff09;&#xff0c;一步一步地搭建自己的Plaxis模型&a…

dm-verity hashtree的結構

參考了&#xff1a;實現 dm-verity | Android Open Source Project (google.cn)。基于這個添加了一層原始數據&#xff0c;便于理解。 結構圖如下&#xff1a; 對hashtree結構圖的解釋&#xff1a; dev data&#xff1a;表示我們的分區數據。這里我們將dev data按照指定的大…

【C++進階學習】第六彈——set和map——體會用C++來構建二叉搜索樹

set和map基礎&#xff1a;【C進階學習】第五彈——二叉搜索樹——二叉樹進階及set和map的鋪墊-CSDN博客 前言&#xff1a; 在上篇的學習中&#xff0c;我們已經學習了如何使用C語言來實現二叉搜索樹&#xff0c;在C中&#xff0c;我們是有現成的封裝好的類模板來實現二叉搜索樹…

第二講 數據結構

#數組模擬鏈表 #include <iostream> using namespace std; const int N 100010; int head ,e[N], ne[N],idx; //ne[i]表示節點i的next指針是多少 //e[i]表示節點i 的值 //head 表示頭結點的下標 //idx 存儲當前已經用了哪個點 void init() {head -1;//頭結點指向下標為…

前端實現PDF文件打印和下載

在Web開發中&#xff0c;經常需要處理PDF文件&#xff0c;尤其是在業務涉及發票、報告或文檔生成的場景下。本文將詳細介紹如何使用前端技術實現PDF文件的打印和下載&#xff0c;我們將利用HTML5的<embed>元素和JavaScript庫FileSaver.js來完成這一任務。 一、環境準備 …

Python 爬蟲:使用打碼平臺來識別各種驗證碼:

本課程使用的是 超級鷹 打碼平臺&#xff0c; 沒有賬戶的請自行注冊&#xff01; 超級鷹驗證碼識別-專業的驗證碼云端識別服務,讓驗證碼識別更快速、更準確、更強大 使用打碼平臺來攻破驗證碼難題&#xff0c; 是很簡單容易的&#xff0c; 但是要錢&#xff01; 案例代碼及測…

React18+Redux+antd 項目實戰 JS

React18Reduxantd 項目實戰 js Ant Design插件官網 Axios官網 (可配置請求攔截器和響應攔截器) JavaScript官網 Echarts官網 一、項目前期準備 1.創建新項目 hotel-manager npx create-react-app hotel-manager2.安裝依賴 //安裝路由 npm i react-router-domnpm i aixos /…

CentOS搭建郵件服務器:DNS配置方法技巧?

CentOS搭建郵件服務器的流程&#xff1f;如何高效使用CentOS&#xff1f; 在當今數字化時代&#xff0c;郵件服務器的需求日益增加。為了確保郵件能夠順利送達&#xff0c;正確的DNS配置是必不可少的一環。AokSend將詳細介紹在CentOS搭建郵件服務器過程中&#xff0c;如何進行…

SpringBoot新手快速入門系列教程7:基于Redis的一個簡單存取數據的例子

我的教程都是親自測試可行才發布的&#xff0c;如果有任何問題歡迎留言或者來群里我每天都會解答。 新手可能有這樣的疑問&#xff0c;有了數據庫的存取方式&#xff0c;我們為什么還要使用Redis這種緩存數據庫讀取方式呢&#xff1f; 原因主要有以下幾點&#xff1a; 1. 性能…