那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

聊聊消息隊列的技術選型,哪個最香!

jf_ro2CN3Fa ? 來源:勇哥java實戰分享 ? 2023-02-20 10:54 ? 次閱讀

  • 1 初識ActiveMQ
    • 1.1 異步&解耦
    • 1.2 調度中心
    • 1.3 重啟大法
    • 1.4 復盤
  • 2 進階Redis&RabbitMQ
    • 2.1 Redis可以做消息隊列嗎
    • 2.2 RabbitMQ是管子不是池子
  • 3 升華MetaQ
    • 3.1 驚艷消費者模型
    • 3.2 激進的消峰
    • 3.3 消息SDK封裝
    • 3.4 重構MetaQ , 自成體系
  • 4 鐘情RocketMQ
    • 4.1 開源的盛宴
    • 4.2 Kafka: 大數據生態的不可或缺的部分
    • 4.3 如何技術選型
  • 5 寫到最后
36a8fd00-b0c9-11ed-bfe3-dac502259ad0.jpg

談起消息隊列,內心還是會有些波瀾。

消息隊列 ,緩存,分庫分表是高并發解決方案三劍客,而消息隊列是我最喜歡,也是思考最多的技術。

我想按照下面的四個階段分享我與消息隊列的故事,同時也是對我技術成長經歷的回顧。

  • 初識:ActiveMQ
  • 進階:Redis&RabbitMQ
  • 升華:MetaQ
  • 鐘情:RocketMQ

1 初識ActiveMQ

1.1 異步&解耦

2011年初,我在一家互聯網彩票公司做研發。

我負責的是用戶中心系統,提供用戶注冊,查詢,修改等基礎功能。用戶注冊成功之后,需要給用戶發送短信。

因為原來都是面向過程編程,我就把新增用戶模塊和發送短信模塊都揉在一起了。

36de7548-b0c9-11ed-bfe3-dac502259ad0.png

起初都還好,但問題慢慢的顯現出來。

  • 短信渠道不夠穩定,發送短信會達到5秒左右,這樣用戶注冊接口耗時很大,影響前端用戶體驗;
  • 短信渠道接口發生變化,用戶中心代碼就必須修改了。但用戶中心是核心系統。每次上線都必要謹小慎微。這種感覺很別扭,非核心功能影響到核心系統了。

第一個問題,我可以采取線程池的方法來做,主要是異步化 。但第二個問題卻讓我束手無措。

于是我向技術經理請教,他告訴我引入消息隊列去解決這個問題。

  • 將發送短信功能單獨拆成獨立的Job服務;
  • 用戶中心用戶注冊成功后,發送一條消息到消息隊列,Job服務收到消息調用短信服務發送短信即可。
36f9d52c-b0c9-11ed-bfe3-dac502259ad0.png

這時,我才明白: 消息隊列最核心的功能就是異步解耦

1.2 調度中心

彩票系統的業務是比較復雜的。在彩票訂單的生命周期里,經過創建,拆分子訂單,出票,算獎等諸多環節。每一個環節都需要不同的服務處理,每個系統都有自己獨立的表,業務功能也相對獨立。假如每個應用都去修改訂單主表的信息,那就會相當混亂了。

公司的架構師設計了調度中心 的服務,調度中心的職責是維護訂單核心狀態機,訂單返獎流程,彩票核心數據生成。370b0248-b0c9-11ed-bfe3-dac502259ad0.png

調度中心通過消息隊列 和出票網關,算獎服務等系統傳遞和交換信息。

這種設計在那個時候青澀的我的眼里,簡直就是水滴vs人類艦隊,降維打擊。

隨著我對業務理解的不斷深入,我隱約覺得:“好的架構是簡潔的,也是應該易于維護的”。

當彩票業務日均千萬交易額的時候,調度中心的研發維護人員也只有兩個人。調度中心的源碼里業務邏輯,日志,代碼規范都是極好的。

在我日后的程序人生里,我也會下意識模仿調度中心的編碼方式,“不玩奇技淫巧,代碼是給人閱讀的”。

1.3 重啟大法

隨著彩票業務的爆炸增長,每天的消息量從30萬激增到150~200萬左右,一切看起來似乎很平穩。

某一天雙色球投注截止,調度中心無法從消息隊列中消費數據。消息總線處于只能發,不能收的狀態下。整個技術團隊都處于極度的焦慮狀態,“要是出不了票,那可是幾百萬的損失呀,要是用戶中了兩個雙色球?那可是千萬呀”。大家急得像熱鍋上的螞蟻。

這也是整個技術團隊第一次遇到消費堆積的情況,大家都沒有經驗。

首先想到的是多部署幾臺調度中心服務,部署完成之后,調度中心消費了幾千條消息后還是Hang住了。這時,架構師只能采用重啟 的策略。你沒有看錯,就是重啟大法。說起來真的很慚愧,但當時真的只能采用這種方式。

調度中心重啟后,消費了一兩萬后又Hang住了。只能又重啟一次。來來回回持續20多次,像擠牙膏一樣。而且隨著出票截止時間的臨近,這種思想上的緊張和恐懼感更加強烈。終于,通過1小時的手工不斷重啟,消息終于消費完了。

我當時正好在讀畢玄老師的《分布式java應用基礎與實踐》,猜想是不是線程阻塞了,于是我用Jstack命令查看堆棧情況。果然不出所料,線程都阻塞在提交數據的方法上。

371cae94-b0c9-11ed-bfe3-dac502259ad0.jpg

我們馬上和DBA溝通,發現oracle數據庫執行了非常多的大事務,每次大的事務執行都需要30分鐘以上,導致調度中心的調度出票線程阻塞了。

技術部后來采取了如下的方案規避堆積問題:

  1. 生產者發送消息的時候,將超大的消息拆分成多批次的消息,減少調度中心執行大事務的幾率;
  2. 數據源配置參數,假如事務執行超過一定時長,自動拋異常,回滾。

1.4 復盤

Spring封裝的ActiveMQ的API非常簡潔易用,使用過程中真的非常舒服。

受限于當時彩票技術團隊的技術水平和視野,我們在使用ActiveMQ中遇到了一些問題。

高吞吐下,堆積到一定消息量易Hang住

技術團隊發現在吞吐量特別高的場景下,假如消息堆積越大,ActiveMQ有較小幾率會Hang住的。

出票網關的消息量特別大,有的消息并不需要馬上消費,但是為了規避消息隊列Hang住的問題,出票網關消費數據的時候,先將消息先持久化到本地磁盤,生成本地XML文件,然后異步定時執行消息。通過這種方式,我們大幅度提升了出票網關的消費速度,基本杜絕了出票網關隊列的堆積。

但這種方式感覺也挺怪的,消費消息的時候,還要本地再存儲一份數據,消息存儲在本地,假如磁盤壞了,也有丟消息的風險。

高可用機制待完善

我們采用的master/slave部署模式,一主一從,服務器配置是4核8G 。

這種部署方式可以同時運行兩個ActiveMQ, 只允許一個slave連接到Master上面,也就是說只能有2臺MQ做集群,這兩個服務之間有一個數據備份通道,利用這個通道Master向Slave單向地數據備份。這個方案在實際生產線上不方便, 因為當Master掛了之后, Slave并不能自動地接收Client發來的請來,需要手動干預,且要停止Slave再重啟Master才能恢復負載集群。

還有一些很詭異丟消息的事件,生產者發送消息成功,但master控制臺查詢不到,但slave控制臺竟然能查詢到該消息。

但消費者沒有辦法消費slave上的消息,還得通過人工介入的方式去處理。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

2 進階Redis&RabbitMQ

2014年,我在藝龍網從事紅包系統和優惠券系統優化相關工作。

2.1 Redis可以做消息隊列嗎

酒店優惠券計算服務使用的是初代流式計算框架Storm 。Storm這里就不詳細介紹,可以參看下面的邏輯圖:373027c6-b0c9-11ed-bfe3-dac502259ad0.jpg

這里我們的Storm集群的水源頭(數據源)是redis集群,使用list 數據結構實現了消息隊列的push/pop功能。373f6844-b0c9-11ed-bfe3-dac502259ad0.png

流式計算的整體流程:

  1. 酒店信息服務發送酒店信息到Redis集群A/B;
  2. Storm的spout組件從Redis集群A/B獲取數據, 獲取成功后,發送tuple消息給Bolt組件;
  3. Bolt組件收到消息后,通過運營配置的規則對數據進行清洗;
  4. 最后Storm把處理好的數據發送到Redis集群C;
  5. 入庫服務從Redis集群C獲取數據,存儲數據到數據庫;
  6. 搜索團隊掃描數據庫表,生成索引

375062de-b0c9-11ed-bfe3-dac502259ad0.pngstorm說明

這套流式計算服務每天處理千萬條數據,處理得還算順利。但方案在團隊內部還是有不同聲音:

  • storm的拓撲升級時候,或者優惠券服務重啟的時候,偶爾出現丟消息的情況。但消息的丟失,對業務來講沒有那么敏感,而且我們也提供了手工刷新的功能,也在業務的容忍范圍內;
  • 團隊需要經常關注Redis的緩存使用量,擔心Redis隊列堆積, 導致out of memory;
  • 架構師認為搜索團隊直接掃描數據庫不夠解耦,建議將Redis集群C替換成Kafka,搜索團隊從kafka直接消費消息,生成索引;

我認為使用Redis做消息隊列應該滿足如下條件:

  1. 容忍小概率消息丟失,通過定時任務/手工觸發達到最終一致的業務場景;
  2. 消息堆積概率低,有相關的報警監控;
  3. 消費者的消費模型要足夠簡單。

2.2 RabbitMQ是管子不是池子

RabbitMQ是用erlang 語言編寫的。RabbitMQ滿足了我的兩點需求:

  1. 高可用機制。藝龍內部是使用的鏡像高可用模式,而且這種模式在藝龍已經使用了較長時間了,穩定性也得到了一定的驗證。
  2. 我負責的紅包系統里,RabbitMQ每天的吞吐也在百萬條消息左右,消息的發送和消費都還挺完美。

優惠券服務原使用SqlServer ,由于數據量太大,技術團隊決定使用分庫分表的策略,使用公司自主研發的分布式數據庫DDA。37868cf6-b0c9-11ed-bfe3-dac502259ad0.png

因為是第一次使用分布式數據庫,為了測試DDA的穩定性,我們模擬發送1000萬條消息到RabbitMQ,然后優惠券重構服務消費消息后,按照用戶編號hash到不同的mysql庫。

RabbitMQ集群模式是鏡像高可用,3臺服務器,每臺配置是4核8G 。

我們以每小時300萬條消息的速度發送消息,最開始1個小時生產者和消費者表現都很好,但由于消費者的速度跟不上生產者的速度,導致消息隊列有積壓情況產生。第三個小時,消息隊列已堆積了500多萬條消息了, 生產者發送消息的速度由最開始的2毫秒激增到500毫秒左右。RabbitMQ的控制臺已血濺當場,標紅報警。

這是一次無意中的測試,從測試的情況來看,RabbitMQ很優秀,但RabbitMQ對消息堆積的支持并不好,當大量消息積壓的時候,會導致 RabbitMQ 的性能急劇下降

有的朋友對我講:“RabbitMQ明明是管子,你非得把他當池子?”

隨著整個互聯網數據量的激增, 很多業務場景下是允許適當堆積的,只要保證消費者可以平穩消費,整個業務沒有大的波動即可。

我心里面越來越相信:消息隊列既可以做管子 ,也可以當做池子

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

3 升華MetaQ

Metamorphosis的起源是我從對linkedin的開源MQ–現在轉移到apache的kafka的學習開始的,這是一個設計很獨特的MQ系統,它采用pull機制,而 不是一般MQ的push模型,它大量利用了zookeeper做服務發現和offset存儲,它的設計理念我非常欣賞并贊同,強烈建議你閱讀一下它的設計文檔,總體上說metamorphosis的設計跟它是完全一致的。--- MetaQ的作者莊曉丹

3.1 驚艷消費者模型

2015年,我主要從事神州專車訂單研發工作。

MetaQ滿足了我對于消息隊列的幻想:“分布式,高吞吐,高堆積”。

MetaQ支持兩種消費模型:集群消費廣播消費 ,因為以前使用過的消費者模型都是用隊列模型,當我第一次接觸到這種發布訂閱模型的時候還是被驚艷到了。

集群消費

379520cc-b0c9-11ed-bfe3-dac502259ad0.png

訂單創建成功后,發送一條消息給MetaQ。這條消息可以被派單服務消費,也可以被BI服務消費。

廣播消費

派單服務在講訂單指派給司機的時候,會給司機發送一個推送消息。推送就是用廣播消費的模式實現的。

37cd4218-b0c9-11ed-bfe3-dac502259ad0.png

大體流程是:

  1. 司機端推送服務是一個TCP服務,啟動后,采用的是廣播模式消費MetaQ的PushTopic;
  2. 司機端會定時發送TCP請求到推送服務,鑒權成功后,推送服務會保存司機編號和channel的引用;
  3. 派單服務發送推送消息到MetaQ;
  4. 推送服務的每一臺機器都會收到該消息,然后判斷內存中是否存在該司機的channel引用,若存在,則推送消息。

這是非常經典的廣播消費的案例。我曾經研讀京麥TCP網關的設計,它的推送也是采用類似的方式。

3.2 激進的消峰

2015年是打車大戰硝煙彌漫的一年。

對神州專車來講,隨著訂單量的不斷增長,欣喜的同時,性能的壓力與日俱增。早晚高峰期,用戶打車的時候,經常點擊下單經常無響應。在系統層面來看,專車api網關發現大規模超時,訂單服務的性能急劇下降。數據庫層面壓力更大,高峰期一條記錄插入竟然需要8秒的時間。

整個技術團隊需要盡快提升專車系統的性能,此前已經按照模塊領域做了數據庫的拆分。但系統的瓶頸依然很明顯。

我們設計了現在看來有點激進的方案:

  1. 設計訂單緩存。緩存方案大家要有興趣,我們可以以后再聊,里面有很多可以詳聊的點;
  2. 在訂單的載客生命周期里,訂單的修改操作先修改緩存,然后發送消息到MetaQ,訂單落盤服務消費消息,并判斷訂單信息是否正常(比如有無亂序),若訂單數據無誤,則存儲到數據庫中。
38086424-b0c9-11ed-bfe3-dac502259ad0.png

這里有兩個細節:

  1. 消費者消費的時候需要順序消費,實現的方式是按照訂單號路由到不同的partition,同一個訂單號的消息,每次都發到同一個partition;38436b3c-b0c9-11ed-bfe3-dac502259ad0.png
  2. 一個守護任務,定時輪詢當前正在進行的訂單,當緩存與數據不一致時候,修復數據,并發送報警。

這次優化大大提升訂單服務的整體性能,也為后來訂單服務庫分庫分表以及異構打下了堅實的基礎,根據我們的統計數據,基本沒有發生過緩存和數據庫最后不一致的場景。但這種方案對緩存高可用有較高的要求,還是有點小激進吧。

3.3 消息SDK封裝

做過基礎架構的同學可能都有經驗:“三方組件會封裝一層”,神州架構團隊也是將metaq-client封裝了一層。

在我的思維里面,封裝一層可以減少研發人員使用第三方組件的心智投入,統一技術棧,也就如此了。

直到發生一次意外,我的思維升級了。那是一天下午,整個專車服務崩潰較長時間。技術團隊發現:"專車使用zookeeper做服務發現。zk集群的leader機器掛掉了,一直在選主。"

臨時解決后,我們發現MetaQ和服務發現都使用同一套zk集群,而且consumer的offset提交,以及負載均衡都會對zk集群進行大量的寫操作。

為了減少MetaQ對zk集群的影響,我們的目標是:“MetaQ使用獨立的zk集群”。

  1. 需要部署新的zk集群;
  2. MetaQ的zk數據需要同步到新的集群;
  3. 保證切換到新的集群,應用服務基本無感知。

我很好奇向架構部同學請教,他說新的集群已經部署好了,但需要同步zk數據到新的集群。他在客戶端里添加了雙寫 的操作。也就是說:我們除了會寫原有的zk集群一份數據,同時也會在新的zk集群寫一份。過了幾周后,MetaQ使用獨立的zk集群這個任務已經完成了。

這一次的經歷帶給我很大的感慨:“還可以這么玩?” ,也讓我思考著:三方組件封裝沒有想像中那么簡單。

我們可以看下快手 消息的SDK封裝策略:

  1. 對外只提供最基本的 API,所有訪問必須經過SDK提供的接口。簡潔的 API 就像冰山的一個角,除了對外的簡單接口,下面所有的東西都可以升級更換,而不會破壞兼容性 ;
  2. 業務開發起來也很簡單,只要需要提供 Topic(全局唯一)和 Group 就可以生產和消費,不用提供環境、NameServer 地址等。SDK 內部會根據 Topic 解析出集群 NameServer 的地址,然后連接相應的集群。生產環境和測試環境環境會解析出不同的地址,從而實現了隔離;
  3. 上圖分為 3 層,第二層是通用的,第三層才對應具體的 MQ 實現,因此,理論上可以更換為其它消息中間件,而客戶端程序不需要修改;
  4. SDK 內部集成了熱變更機制,可以在不重啟 Client 的情況下做動態配置,比如下發路由策略(更換集群 NameServer 的地址,或者連接到別的集群去),Client 的線程數、超時時間等。通過 Maven 強制更新機制,可以保證業務使用的 SDK 基本上是最新的。
3872e434-b0c9-11ed-bfe3-dac502259ad0.png

3.4 重構MetaQ , 自成體系

我有一個習慣 : "經常找運維,DBA,架構師了解當前系統是否有什么問題,以及他們解決問題的思路。這樣,我就有另外一個視角來審視公司的系統運行情況"。

MetaQ也有他的缺點。

  1. MetaQ的基層通訊框架是gecko,MetaQ偶爾會出現rpc無響應,應用假死的情況,不太好定位問題;
  2. MetaQ的運維能力薄弱,只有簡單的Dashboard界面,無法實現自動化主題申請,消息追蹤等功能。

有一天,我發現測試環境的一臺消費者服務器啟動后,不斷報鏈接異常的問題,而且cpu占用很高。我用netstat命令馬上查一下,發現已經創建了幾百個鏈接。出于好奇心,我打開了源碼,發現網絡通訊框架gecko已經被替換成了netty。我們馬上和架構部的同學聯系。

我這才明白:他們已經開始重構MetaQ了。我從來沒有想過重構一個開源軟件,因為距離我太遠了。或者那個時候,我覺得自己的能力還達不到。

后來,神州自研的消息隊列自成體系了,已經在生產環境運行的挺好。

時至今天,我還是很欣賞神州架構團隊。他們自研了消息隊列,DataLink(數據異構中間件),分庫分表中間件等。他們愿意去創新,有勇氣去做一個更好的技術產品。

我從他們身上學到很多。

也許在看到他們重構MetaQ的那一刻,我的心里埋下了種子。

4 鐘情RocketMQ

4.1 開源的盛宴

2014年,我搜羅了很多的淘寶的消息隊列的資料,我知道MetaQ的版本已經升級MetaQ 3.0,只是開源版本還沒有放出來。

大約秋天的樣子,我加入了RocketMQ技術群。誓嘉(RocketMQ創始人)在群里說:“最近要開源了,放出來后,大家趕緊fork呀”。他的這句話發在群里之后,群里都炸開了鍋。我更是歡喜雀躍,期待著能早日見到阿里自己內部的消息中間件。38ad5858-b0c9-11ed-bfe3-dac502259ad0.png

終于,RocketMQ終于開源了。我迫不及待想一窺他的風采。

因為我想學網絡編程,而RocketMQ的通訊模塊remoting底層也是Netty寫的。所以,RocketMQ的通訊層是我學習切入的點。

我模仿RocketMQ的remoting寫了一個玩具的rpc,這更大大提高我的自信心。正好,藝龍舉辦技術創新活動。我想想,要不嘗試一下用Netty改寫下Cobar的通訊模塊。于是參考Cobar的源碼花了兩周寫了個netty版的proxy,其實非常粗糙,很多功能不完善。后來,這次活動頒給我一個鼓勵獎,現在想想都很好玩。

因為在神州優車使用MetaQ的關系,我學習RocketMQ也比較得心應手。為了真正去理解源碼,我時常會參考RocketMQ的源碼,寫一些輪子來驗證我的學習效果。

雖然自己做了一些練習,但一直沒有在業務環境使用過。2018年是我真正使用RocketMQ的一年,也是有所得的一年。

短信服務

短信服務應用很廣泛,比如用戶注冊登錄驗證碼,營銷短信,下單成功短信通知等等。最開始設計短信服務的時候,我想學習業界是怎么做的。于是把目標鎖定在騰訊云的短信服務上。騰訊云的短信服務有如下特點:

  • 統一的SDK,后端入口是http/https服務 , 分配appId/appSecret鑒權;
  • 簡潔的API設計:單發,群發,營銷單發,營銷群發,模板單發,模板群發。

于是,我參考了這種設計思路。

  1. 模仿騰訊云的SDK設計,提供簡單易用的短信接口;
  2. 設計短信服務API端,接收發短信請求,發送短信信息到消息隊列;
  3. worker服務消費消息,按照負載均衡的算法,調用不同渠道商的短信接口;
  4. Dashboard可以查看短信發送記錄,配置渠道商信息。38c53054-b0c9-11ed-bfe3-dac502259ad0.png

短信服務是我真正意義第一次生產環境使用RocketMQ,當短信一條條發出來的時候,還是蠻有成就感的。

MQ控制臺

38dce672-b0c9-11ed-bfe3-dac502259ad0.png

使用過RocketMQ的朋友,肯定對上圖的控制臺很熟悉。當時團隊有多個RocketMQ集群,每組集群都需要單獨部署一套控制臺。于是我想著:能不能稍微把控制臺改造一番,能滿足支持多組集群。

于是,擼起袖子干了起來。大概花了20天的時間,我們基于開源的版本改造了能支持多組集群的版本。做完之后,雖然能滿足我最初的想法,但是做的很粗糙。而且搜狐開源了他們自己的MQCloud ,我看了他們的設計之后, 覺得離一個消息治理平臺還很遠。

后來我讀了《網易云音樂的消息隊列改造之路》,《今日頭條在消息服務平臺和容災體系建設方面的實踐與思考》這兩篇文章,越是心癢難耐,蠻想去做的是一個真正意義上的消息治理平臺。一直沒有什么場景和機會,還是有點可惜。

最近看了哈羅單車架構專家梁勇的一篇文章《哈啰在分布式消息治理和微服務治理中的實踐》,推薦大家一讀。

一扇窗子,開始自研組件

后來,我嘗試進一步深入使用RocketMQ。

  • 仿ONS風格封裝消息SDK;
  • 運維側平滑擴容消息隊列;
  • 生產環境DefaultMQPullConsumer消費模式嘗試

這些做完之后,我們又自研了注冊中心、配置中心,任務調度系統。設計這些系統的時候,從RocketMQ源碼里汲取了很多的營養,雖然現在看來有很多設計不完善的地方,代碼質量也有待提高,但做完這些系統后,還是大大提升我的自信心。

RocketMQ給我打開了一扇窗子,讓我能看到更廣闊的Java世界。對我而言,這就是開源的盛宴。

4.2 Kafka: 大數據生態的不可或缺的部分

Kafka是一個擁有高吞吐、可持久化、可水平擴展,支持流式數據處理等多種特性的分布式消息流處理中間件,采用分布式消息發布與訂閱機制,在日志收集、流式數據傳輸、在線/離線系統分析、實時監控等領域有廣泛的應用。

日志同步

在大型業務系統設計中,為了快速定位問題,全鏈路追蹤日志,以及故障及時預警監控,通常需要將各系統應用的日志集中分析處理。

Kafka設計初衷就是為了應對大量日志傳輸場景,應用通過可靠異步方式將日志消息同步到消息服務,再通過其他組件對日志做實時或離線分析,也可用于關鍵日志信息收集進行應用監控。

日志同步主要有三個關鍵部分:日志采集客戶端,Kafka消息隊列以及后端的日志處理應用。

  1. 日志采集客戶端,負責用戶各類應用服務的日志數據采集,以消息方式將日志“批量”“異步”發送Kafka客戶端。Kafka客戶端批量提交和壓縮消息,對應用服務的性能影響非常小。
  2. Kafka將日志存儲在消息文件中,提供持久化。
  3. 日志處理應用,如Logstash,訂閱并消費Kafka中的日志消息,最終供文件搜索服務檢索日志,或者由Kafka將消息傳遞給Hadoop等其他大數據應用系統化存儲與分析。

日志同步示意圖:

3910fe1c-b0c9-11ed-bfe3-dac502259ad0.png

流計算處理

在很多領域,如股市走向分析、氣象數據測控、網站用戶行為分析,由于數據產生快、實時性強且量大,您很難統一采集這些數據并將其入庫存儲后再做處理,這便導致傳統的數據處理架構不能滿足需求。Kafka以及Storm、Samza、Spark等流計算引擎的出現,就是為了更好地解決這類數據在處理過程中遇到的問題,流計算模型能實現在數據流動的過程中對數據進行實時地捕捉和處理,并根據業務需求進行計算分析,最終把結果保存或者分發給需要的組件。

數據中轉樞紐

近10多年來,諸如KV存儲(HBase)、搜索(ElasticSearch)、流式處理(Storm、Spark、Samza)、時序數據庫(OpenTSDB)等專用系統應運而生。這些系統是為單一的目標而產生的,因其簡單性使得在商業硬件上構建分布式系統變得更加容易且性價比更高。通常,同一份數據集需要被注入到多個專用系統內。例如,當應用日志用于離線日志分析時,搜索單個日志記錄同樣不可或缺,而構建各自獨立的工作流來采集每種類型的數據再導入到各自的專用系統顯然不切實際,利用消息隊列Kafka版作為數據中轉樞紐,同份數據可以被導入到不同專用系統中。

下圖是美團 MySQL 數據實時同步到 Hive 的架構圖,也是一個非常經典的案例。

391f5160-b0c9-11ed-bfe3-dac502259ad0.jpg

4.3 如何技術選型

2018年去哪兒QMQ開源了,2019年騰訊TubeMQ開源了,2020年Pulsar如火如荼。

消息隊列的生態是如此的繁榮,那我們如何選型呢?

我想我們不必局限于消息隊列,可以再擴大一下。簡單談一談我的看法。

Databases are specializing – the “one size fits all” approach no longer applies ----- MongoDB設計哲學

第一點:先有場景,然后再有適配這種場景的技術。什么樣的場景選擇什么樣的技術。

第二點:現實往往很復雜,當我們真正做技術選型,并需要落地的時候,技術儲備成本 是兩個我們需要重點考量的因素。

技術儲備

  • 技術團隊有無使用這門技術的經驗,是否踩過生產環境的坑,以及針對這些坑有沒有完備的解決方案;
  • 架構團隊是否有成熟的SDK,工具鏈,甚至是技術產品。

成本

  • 研發,測試,運維投入人力成本;
  • 服務器資源成本;
  • 招聘成本等。

最后一點是 的因素,特別是管理者的因素。每一次大的技術選型考驗技術管理者的視野,格局,以及管理智慧。

5 寫到最后

我覺得這個世界上沒有什么毫無道理的橫空出世,真的,如果沒有大量的積累大量的思考是不會把事情做好的。。。總之,在經歷了這部電影以后,我覺得我要學的太多了,這世界上有太多的能人,你以為的極限,弄不好,只是別人的起點。所以只有不停地進取,才能不丟人。那,人可以不上學,但一定要學習,真的。------ 韓寒《后會無期》演講

我學習消息隊列的過程是不斷思考,不斷實踐的過程,雖然我以為的極限,弄不好,只是別人的起點,但至少現在,當我面對這門技術的時候,我的內心充滿了好奇心,同時也是無所畏懼的。

我始終相信:每天學習一點點,比昨天進步一點點就好。

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3637

    瀏覽量

    93988
  • 線程
    +關注

    關注

    0

    文章

    505

    瀏覽量

    19758
  • 消息隊列
    +關注

    關注

    0

    文章

    33

    瀏覽量

    3017

原文標題:用了8年MQ!聊聊消息隊列的技術選型,哪個最香!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FIFO隊列原理簡述

    FIFO是隊列機制中最簡單的,每個接口上只有一個FIFO隊列,表面上看FIFO隊列并沒有提供什么QoS保證,甚至很多人認為FIFO嚴格意義上不算做一種隊列
    發表于 07-10 09:22 ?1707次閱讀

    聊一聊消息隊列技術選型的7種消息場景

    我們在做消息隊列技術選型時,往往會結合業務場景進行考慮。今天來聊一聊消息隊列可能會用到的 7 種消息場景。
    的頭像 發表于 12-09 17:50 ?1433次閱讀
    聊一聊消息<b class='flag-5'>隊列</b><b class='flag-5'>技術</b><b class='flag-5'>選型</b>的7種消息場景

    labviEW中的通知技術隊列問題

    通知技術隊列技術兩者相比,有什么大的區別?我自己理解是通知技術有可能丟失數據,隊列相對來講不易丟失,除此之外還有什么?請教一下大家
    發表于 03-31 11:14

    【直播預告】今晚7點,來HarmonyOS極客松直播間與技術專家聊聊技術

    HarmonyOS極客松直播間與技術專家聊聊技術
    發表于 06-20 11:08

    為什么感覺FPGA那么

    為什么感覺FPGA那么
    發表于 11-08 16:39

    蘋果iPhone12和13哪個

    在 iPhone 12 發布之初,網絡上就有一種聲音說:別買 iPhone 12,iPhone 13 更香。因為王守義說過:十三! 明美無限本以為是一種調侃,沒想到網友們一語成讖,iPhone
    的頭像 發表于 12-08 14:12 ?1.5w次閱讀

    利用CAS技術實現無鎖隊列

    【 導讀 】:本文 主要講解利用CAS技術實現無鎖隊列。 關于無鎖隊列的實現,網上有很多文章,雖然本文可能和那些文章有所重復,但是我還是想以我自己的方式把這些文章中的重要的知識點串起來和大家講一講
    的頭像 發表于 01-11 10:52 ?2343次閱讀
    利用CAS<b class='flag-5'>技術</b>實現無鎖<b class='flag-5'>隊列</b>

    SystemVerilog中的隊列

    隊列是大小可變的有序集合,隊列中元素必須是同一個類型的。隊列支持對其所有元素的訪問以及在隊列的開始或結束處插入和刪除。
    的頭像 發表于 10-31 10:09 ?4158次閱讀

    什么是消息隊列?消息隊列中間件重要嗎?

    應用解耦:消息隊列減少了服務之間的耦合性,不同的服務可以通過消息隊列進行通信,而不用關心彼此的實現細節。
    的頭像 發表于 11-07 14:55 ?1472次閱讀

    嵌入式環形隊列和消息隊列的實現

    嵌入式環形隊列和消息隊列是實現數據緩存和通信的常見數據結構,廣泛應用于嵌入式系統中的通信協議和領域。
    的頭像 發表于 04-14 11:52 ?1624次閱讀

    RTOS消息隊列的應用

    基于RTOS的應用中,通常使用隊列機制實現任務間的數據交互,一個應用程序可以有任意數量的消息隊列,每個消息隊列都有自己的用途。
    發表于 05-29 10:49 ?664次閱讀
    RTOS消息<b class='flag-5'>隊列</b>的應用

    SENSORO 支撐百萬級傳感器的延時隊列

    文/升哲科技劉鵬摘要:本文主要描述升哲科技在打造物聯智慧城市平臺過程中關于如何實現延時隊列服務的技術選型經驗、延時隊列服務的架構設計以及延時隊列
    的頭像 發表于 08-26 11:44 ?817次閱讀
    SENSORO 支撐百萬級傳感器的延時<b class='flag-5'>隊列</b>

    FreeRTOS消息隊列介紹

    隊列是為了任務與任務、任務與中斷之間的通信而準備的,可以在任務與任務、任務與中斷之間傳遞消息,隊列中可以存儲有限的、大小固定的數據項目。任務與任務、任務與中斷之間要交流的數據保存在隊列中,叫做
    的頭像 發表于 07-06 16:58 ?853次閱讀
    FreeRTOS消息<b class='flag-5'>隊列</b>介紹

    嵌入式環形隊列與消息隊列的實現原理

    嵌入式環形隊列,也稱為環形緩沖區或循環隊列,是一種先進先出(FIFO)的數據結構,用于在固定大小的存儲區域中高效地存儲和訪問數據。其主要特點包括固定大小的數組和兩個指針(頭指針和尾指針),分別指向隊列的起始位置和結束位置。
    的頭像 發表于 09-02 15:29 ?660次閱讀

    JavaWeb消息隊列使用指南

    在現代的JavaWeb應用中,消息隊列(Message Queue)是一種常見的技術,用于異步處理任務、解耦系統組件、提高系統性能和可靠性。 1. 消息隊列的基本概念 消息隊列是一種應
    的頭像 發表于 11-25 09:27 ?193次閱讀
    黄金百家乐官网的玩法技巧和规则| 安卓水果机游戏| 注册百家乐送彩金 | 百家乐官网java| 15人百家乐官网桌布| 环球娱乐城| 彩票游戏| 玉溪市| 广德县| 百家乐官网大眼仔路| 玩百家乐官网输了| 真人百家乐官网平台排行| 博彩e族天上人间| 足球投注网| 百家乐官网路单用处| 九游棋牌大厅| 大发888娱乐场下载 游戏平台| 新世纪娱乐城官方网站| 昌平区| 泗洪县| 太阳城直属现金网| 大发888开户| 德州扑克总督| 百家乐官网佣金计算| 百家乐官网玩法的技巧| 永发娱乐城| 百家乐官网仿水晶筹码| 百家乐官网园36bol在线 | 百家乐二号博彩正网| 德州百家乐21点桌| 大发888扑克官方下载| 大发888娱乐场下载lm0| 大发888国际娱乐网| 365足球| 澳门百家乐官网怎赌才能赚钱| 百家乐官网庄6点| 百家乐不倒翁注码| 百家乐如何赚洗码| 亚洲顶级赌场手机版| 百家乐官网博彩技巧视频| ag百家乐官网下载|