小米消息隊列的選型與實踐

? ? ? ? 之前寫了一篇關于消息隊列的文章:《消息隊列介紹與對比》,本文主要介紹消息隊列在實際工作中的使用情況(截止到2023年,因為我2023年離職了,后續的情況不了解了,哈哈)。

? ? ? ? 市面上的多種消息隊列都有在小米應用,如Notify,Kafka,EMQ,RabbitMQ,Talos,RocketMQ,MQTT等。我們并不是為了使用而使用,主要還是因為部門較多,不同部門業務不同,側重點不同,因此在選型消息隊列時就會根據實際業務需求去選擇更合適的消息隊列。

? ? ? ? 在目前的單位主要還是RabbitMQ,RocketMQ,Kafka主要用于日志采集種。

????????本文主要介紹RabbitMQ,RocketMQ,Talos和Notify等等。

1、RabbitMQ的使用

????????在小米使用RabbitMQ最典型的場景是郵件中繼。在2021年,公司要求所有部門自動發送郵件時不可直連郵件服務器,而是要經過一個郵件中繼Guard,其最主要的目的是讓Guard做一層治理,比如流量管控,避免大量請求都打到郵件服務器。如果某個大神程序沒寫好,每個訂單都發送一封郵件,一天幾十萬訂單,可是要了命了。Guard內部就使用了RabbitMQ,業務系統將郵件發送到Guard,Guard會將所有郵件作為消息頭遞到消息隊列,隨后RabbitMQ負責將消息push到消費者(郵件服務器),在上面有過介紹,push消息的速率完全由broker掌握,我們可以控制Push消息的頻率,類似大家經常說的限流,消峰,這就可以有效避免郵件服務器被瞬時大量郵件打垮。

????????不過也正是因為這點,經常會出現消息堆積,郵件發不出去的場景。如果某個業務發送了大量郵件,可能會影響到其他業務的郵件發送。如何做到相互不影響,也是Guard團隊重點要解決的問題。

? ? ? ? ? 在我目前的單位,RabbitMQ是主推,這主要是領導層決定的,當然我不知道選擇RabbitMQ的具體原因,我來得比較晚。我只知道去年發生過的一個問題是,因為Server重啟,導致隊列丟失,數據丟失,出現事故。這個我在消息隊列介紹中已經說過了,RabbitMQ的隊列默認是auto-delete的,重啟后隊列數據就會全部丟失。而且RabbitMQ的限制還包括它是閱后即焚,非常不方便追溯;最重要的是沒法實現消費分組,這在實際業務中是非常不方便的。所以,我認為RabbitMQ并不是業務中較好的選擇。

2、RocketMQ

????????RocketMQ也是這幾年才在小米大規模使用的,尤其是電商系統,像有品和小米商城,目前只用RocketMQ作為實際業務的消息隊列,日志會用到talos。之前的有品使用過原生的Kafka,也使用過公司自研的Notify。Notify是我個人非常不認同的一個中間件,其內部使用了Mysql和Redis,作為消息隊列,非常不成熟,其架構類似如下:

? ? ? ? 可以看到,其消息隊列依賴于Redis和數據庫,實現的性能以及功能都有待商榷。后來它自己也基于RocketMQ了。額,我能直接用RocketMQ,為什么還要用你啊?

????????后期經過調研,有品最終都換成了RocketMQ,主要是考慮到RocketMQ的幾個特性:

  • 事務寫入
  • Key級別順序消息,可以用訂單號作為hashkey
  • 重試 ,支持不同模式的重試(順序消費時默認無限重試,并發消費可間隔重試16次數)
  • 死信隊列 當達到一定消費次數之后,就直接進入死信隊列,方便后續手動觸發。

小米RocketMQ發展軌跡:

????????我們使用的是開源的RocketMQ,眾所周知,其只支持固定級別的延遲,為了實現任意時間的延遲,小米云團隊參考了DDMQ的經驗借助RocksDB和時間輪以插件的形式無侵入地支持了任意時間的延遲。

????????此外,針對于Pull模式(RocketMQ 4.x)的缺點,也做了改進。由于RocketMQ要求一個分區只能同時被一個消費者消費(同組),因此當消費者數量大于分區數量時,多出的消費者是不能進行消費的,這無疑是一種浪費。因此針對這點,小米進行了優化。優化如下:

????????

? ? ? ? POP模式不會綁定某個實例,彌補了Pull模式的不足,不會出現數據傾斜、消息堆積的問題。實際上,RocketMQ5.X官方已經解決了,官方實現了消費的負載均衡,消息會同時分配給消費者分組中的多個消費者一起分擔,功能要比小米基于4.X版本開發的更加強大。具體可看官網:消費者負載均衡

? ? ? ? ? 在我走之前,RocketMQ一直都是小米主推的消息隊列,主要還是因為特別適用于我們的業務場景。這也是我自己最喜歡用的消息隊列。雖然RocketMQ是基于Kafka思想開發的,但站在巨人的肩膀上并超越它,不是什么壞事。

3、Talos

????????Talos是小米自研的一個消息隊列,已經比較早了,設計它的初衷是因為當時使用的是Kafka 0.8 版,當時版本的Kafka自身存在很多缺點,比如集群擴容和故障恢復時非常麻煩。

Talos實際上也是參考Kafka進行開發的,其主要變化:

1、將存儲和結算相分離。存儲采用HDFS,TalosServer只負責調度;

2、采用一致性hash實現負載均衡。

據Talos團隊介紹,目前Talos實現了:

  • 日處理消息數超過 2 萬億條,日消息峰值 4 千萬條/秒,日處理數據量 1.3PB;
  • Topic 總數 13000+,下游的作業數 15000+,接入業務數量 350+ ;

????????其實,Talos還實現了Exactly Once,這是我覺得比較好的一點(當然,新版本的kafka也已經實現了)。基本思想是在生產者生產一個序列號,同樣的序列號,使得broker不會再繼續處理;在消費端,先查redis緩存,看是否已經處理同樣的序列號,如果已處理,就不再繼續處理。

????????關于Talos這部分,我建議大家看下面參考資料中的小米消息隊列的實踐,里面詳解介紹了talos的由來,架構和特點,非常贊。

參考資料:

千與千尋-淺談Kafka以及Rocketmq的高性能

萬億級消息背后: 小米消息隊列的實踐_云計算_勇幸_InfoQ精選文章

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

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

相關文章

node問題: command not found: nodemon

如何安裝并使用 nodemon npm i -g nodemon 問題與解決方案: 問題:zsh: command not found: nodemon 解決方案: 在你的 package.json 中加入: "scripts": {"auto": "npx nodemon server.js" }…

單例模式及應用場景

如果希望自己的代碼更優雅、可維護性更高以及更簡潔,往往離不開設計模式這一解決方案。 在JS設計模式中,最核心的思想:封裝變化(將變與不變分離,確保變化的部分靈活,不變的部分穩定)。 那么來…

[嵌入式系統-36]:龍芯1B 開發學習套件 -5- PMON常見命令

目錄 0. 開機時按c鍵進入pmon模式 (自啟動模式時) 1、幫助命令 h 2、顯示設備信息 devls 3.重啟:reboot 4、設置環境變量 set/unset 5.查詢環境變量:env 6.網絡設置相關命令: ①設置IP:ifconfig&am…

Linux 基礎IO(1)內存文件

文章目錄 鋪墊文件的系統調用接口文件描述符緩沖區 鋪墊 文件文件內容 文件屬性訪問文件之前,都要先打開文件,而要訪問,修改,編輯文件,文件就必須加載到內存中程序運行起來變成進程,被CPU調度,…

詳解Win 7重置電腦操作步驟

文章目錄 介紹Win 7 重置系統的方法:1.按下鍵盤上的Windows鍵和R鍵,打開運行窗口,輸入sysprep 點擊回車確定。2.之后就會出現如下界面,在這個新打開的窗口中雙擊 sysprep 程序3.選擇【進入系統全新體驗(00BE) 】&#…

基于SpringBoot的在線拍賣系統(附項目源碼+論文)

摘要 在線拍賣系統,主要的模塊包括管理員;首頁、個人中心、用戶管理、商品類型管理、拍賣商品管理、歷史競拍管理、競拍訂單管理、留言板管理、系統管理,用戶;首頁、個人中心、歷史競拍管理、競拍訂單管理、留言板管理&#xff0…

Linux重新獲取IP地址

你可以通過重啟客戶端來獲取新的IP地址。可以使用以下命令來重啟DHCP客戶端: sudo dhclient -r # 釋放當前IP sudo dhclient # 獲取新的IP 這將釋放當前的IP地址,并請求新的IP地址。 使用ifdown和ifup命令:另一種方法是使用ifdown和i…

STM32學習和實踐筆記(1): 裝好了的keil μVision 5

2019年3月在淘寶上買了這塊STM32的開發板,學了一段時間后就丟下了,今天重新撿起來,決定好好學習、天天向上。 對照教程,今天先把keil5裝上了。 裝的過程有以下幾點值得記錄下: 1)用注冊機時,…

【應用多元統計分析】--多元數據的直觀表示(R語言作圖)

例1.2 為了研究全國31個省、市、自治區2018年城鎮居民生活消費的分布規律,根據調查資料做區域消費類型劃分。 指標: 食品x1:人均食品支出(元/人) 衣著x2:人均衣著商品支出(元/人) 居住x3:人均居住支出(元/人) 生活x4…

歐拉回路(Eulerian Path)

1.定義 如果圖 G G G(有向圖或者無向圖)中所有邊一次僅且一次行遍所有頂點的通路稱作歐拉通路。 如果圖 G G G中所有邊一次僅且一次行遍所有頂點的回路稱作歐拉回路。 具有歐拉回路的圖成為歐拉圖(簡稱 E E E圖)。具有歐拉通路但不具有歐拉回路的圖成為半歐拉圖。 頂點可以經…

【Linux】Linux常用指令介紹

目錄 1、whoami命令 2、pwd命令 3、ls命令 4、cd命令 5、touch命令 6、mkdir命令 7、rm命令 8、man命令 9、cp命令 10、mv命令 11、cat命令 12、more命令 13、less命令 14、head命令 15、tail命令 16、find命令 1、whoami命令 語法:whoani 功能&a…

SpringMVC--03--前端傳數組給后臺

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 案例1乘客個人信息方法1:表單提交,以字段數組接收方法2:表單提交,以BeanListModel接收方法3:將Json對象序…

leetcode移除元素

注意,在本題中,是對原數組進行操作,需要原地刪除指定元素,所以我們可以采用快慢指針來操作。 顧名思義,快慢指針是有兩個指針,一直快指針,一個慢指針。在本題中,快慢指針起點都是0&a…

解鎖人體姿態的秘密:部件親和場(PAF)的革新應用

部件親和場(PAF)原理及其在人體姿態估計中的應用 摘要: 隨著人工智能技術的發展,人體姿態估計在計算機視覺領域受到越來越多的關注。部件親和場(Part Affinity Fields,簡稱PAF)作為一種新興的人體姿態估計技術,通過構建2D向量場來描述人體肢體的方向和位置信息,從而…

Matlab 機器人工具箱 運動學

文章目錄 R.fkine()R.ikine()R.ikine6s()R.ikuncR.jacob0、R.jacobn、R.jacob_dotjtrajctraj參考鏈接 官網:Robotics Toolbox - Peter Corke R.fkine() 正運動學,根據關節坐標求末端執行器位姿 mdl_puma560; % 加載puma560模型 qz % 零角度 qr …

繼承(使用及深入、super、重寫/復寫)--學習JavaEE的day14

day14 一、繼承 概念 Java中的繼承是一個對象獲取父對象的所有屬性和行為的機制 理解:繼承是指一個類(子類)可以繼承另一個類(父類)的屬性和方法 關鍵字extends 優點:減少代碼的冗余 缺點:繼承會增加類與類之間的關系,會增加代碼…

[Unity3d] 網絡開發基礎【個人復習筆記/有不足之處歡迎斧正/侵刪】

TCP/IP TCP/IP協議是一 系列規則(協議)的統稱,他們定義了消息在網絡間進行傳輸的規則 是供已連接互聯網的設備進行通信的通信規則 OSI模型只是一個基本概念,而TCP/IP協議是基于這個概念的具體實現 TCP和UDP協議 TCP:傳輸控制協議,面向連接&#xff0c…

VsCode配置PCL、Open3D自動補全

寫在前面 本文內容 在VsCode上開發PCL、Open3D相關代碼,代碼自動補全 Open3D、PCL的安裝使用見各個版本的Open3D、PCL的編譯、使用教程 平臺/環境 windows11(windows10): visual studio 2022;cmake 3.22; VsCode 通過cmake構建項目; 轉載請…

Excel MATCH函數 兩張順序不同表格,統一排序

目錄 一. 背景二. 添加輔助列,使用MATCH函數生成排序條件三. 效果 一. 背景 有如下圖所示的兩張表格,分別記錄著同一批人的1月份和2月份的工資。表格A和表格B中的姓名列相同,工資列數據不同現在要求參考表格A中的姓名列對表格B中的數據進行排序&#xf…

C語言:預處理

C語言:預處理 預定義符號#define定義常量定義宏宏與函數對比 #操作符##操作符條件編譯頭文件包含庫文件包含本地文件包含嵌套文件包含 預定義符號 C語?設置了?些預定義符號,可以直接使?,預定義符號也是在預處理期間處理的。 __FILE__ //…