1. 程式人生 > >訊息中介軟體需要解決哪些問題

訊息中介軟體需要解決哪些問題

(1)Publis/Subscribe

釋出訂閱是訊息中介軟體的最基本功能,是相對於傳統的RPC通訊而言。

(2)Message Priority

規範中描述的優先順序是指在一個訊息佇列中,每條訊息都有不同的優先順序,一般用整數來描述,優先順序高的資訊先投遞,如果訊息完全在一個記憶體佇列中,那麼在投遞前可以按照優先順序排序,令優先順序高的先投遞。

由於RocketMQ所有的訊息都是持久化的,所以如果按照優先順序排序,開銷會非常大,因此RockeMQ沒有特意支援訊息優先順序,但是可以通過變通的方式實現類似的功能,即單獨配置一個優先順序高的佇列和一個普通優先順序的佇列。將不同優先順序傳送到不同佇列即可、

對於優先順序問題,歸納為2類:

a、只要達到優先順序目的即可,不是嚴格意義上的優先順序,通常優先順序劃分為高中低或者更多,每個優先順序可以用不同的topic表示,發訊息時,指定不同的topic表示優先順序,這種方式可以解決絕大部分的優先順序問題,但是對業務的優先順序精確性做了妥協。
b、嚴格優先順序,優先順序用整數表示,如0-65535,這種優先順序問題如果用topic解決就不行,如果要MQ解決,會對MQ的效能造成非常大的影響。

(3)Message Order

訊息有序指的是一類訊息消費時,按照發送的順序來消費,例如一個訂單產生了3條訊息,分別是訂單建立,訂單付款,訂單完成,消費時,必須按照這個順序才有意義,但同時訂單之間是可以並行消費的。

RocketMQ是可以嚴格保證訊息有序。

(4)Message Filter

   Broker端過濾訊息,在Broker中,按照Consumer的要求做過濾,優點是減少了對於Consumer無用訊息進行網路傳輸,缺點是增加了Broker的負擔,實現相對複雜。

    (a)淘寶Notify支援多種過濾方式,包括直接按照訊息型別過濾,靈活的語法表示式過濾,幾乎可以滿足最苛刻過濾要求、

   (b)淘寶RocketMQ支援按照簡單的Message Tag過濾,也支援按照Message Header、body進行過濾、

consumer端訊息過濾

   這種過濾方式可由應用完全自定義實現,缺點是很多無用訊息要傳輸到Consumer端。

(5)Message Persistence

訊息中介軟體通常採用幾種持久化方式:

(1)持久化到資料庫,例如MySql

(2)持久化到KV儲存

(3)檔案記錄形式持久化

(4)對記憶體資料做一個持久化映象

(1)(2)(3)三中持久化方式都具有將記憶體佇列Buffer進行擴充套件的能力,(4)只是一個記憶體的映象,作用是當Broker掛掉重啟後仍然能將之前記憶體的資料恢復出來。

RocketMQ 參考了Kafka的持久化方式,充分利用Linux檔案系統記憶體Cache來提高效能。

(6)Message Reliablity

影響訊息可靠性的幾種情況:

(1)Broker正常關閉

(2)Broker異常Crash

(3)OS Crash

(4)機器掉電,但是能立即恢復供電情況、

(5)機器無法開機

(6)磁碟裝置損壞

1、2、3、4都屬於硬體資源可立即恢復情況,RocketMQ在這四種情況下能保證訊息不丟,或者丟失少量資料(依賴刷盤方式是非同步還是同步)

5、6屬於單點故障,且無法恢復,一旦發生,在此單點上的訊息全部丟失,RocketMQ在這兩種情況下,通過非同步複製,可保證99%的訊息不丟,但是仍然會有極少量的訊息可能丟失,通過同步雙寫技術可以完全避免單點,同步雙寫勢必會影響效能,適合對訊息可靠性要求極高的場合,例如與錢相關的應用。

RocketMQ從3.0開始支援同步雙寫。

(7)Low Latency Messaging

在訊息不堆積的情況下,訊息到達Broker後,能立刻到達Consumer。

RocketMQ使用長輪詢Pull方式,可保證訊息非常實時,訊息實時性不低於Push.

(8)At least Once

指每個訊息必須投遞一次

RocektMQ consumer 先pull訊息到本地,消費完成後,才想伺服器返回ack,如果沒有消費一定不會ack,所以RocketMQ可以很好支援此特性。

(9)Exactly Only Once

(a)傳送訊息階段,不允許傳送重複的訊息

(b)消費訊息階段,不允許消費重複的訊息。

只有以上兩個條件都滿足的情況下,才認為訊息是“Exactly only once”,而要實現以上兩點,在分散式環境下,不可避免要產生巨大的開銷,所以RocketMQ為了追求高效能,並不保證此特性,要求在業務上進行去重,也就是消費訊息要做到冪等性,RocketMQ雖然不能嚴格保證不重複,但是正常情況下,很少會出現重複傳送,消費的情況,只有網路異常,Consumer啟停等異常情況下會出現訊息重複。

此問題本質原因是網路呼叫存在不確定性,導致出現既不成功也不失敗的第三種狀態,所以才產生了訊息重複性問題。

(10)Broker的Buffer滿了怎麼辦

Broker的Buffer指的是Broker中一個佇列的記憶體Buffer大小,這類Buffer通常大小有限,若Buffer滿了怎麼辦?

CORBA Notification規範中處理方式:

(1)RejectNewEvents 拒絕新來的訊息,向Producer返回RejectNewEvents錯誤碼。

(2)按照特定策略丟棄已有的訊息

RocketMQ沒有記憶體Buffer概念,RocketMQ的佇列都是持久化磁碟,資料定期清除。

對於此問題的解決思路,RocketMQ同其他MQ有非常顯著的區別,RocketMQ記憶體Buffer抽象成一個無限長度的佇列,不管有多少資料進來都能裝的進來,這個無限是有前提的,Broker會定期刪除過期的資料,例如Broker只會儲存3天的訊息,那麼這個Buffer雖然長度無限,但是3天前的資料會被從隊尾刪除。

(11)回溯訊息

回溯訊息是指Consumer已經消費成功的訊息,由於業務上需求需要重新消費,要支援此功能,Broker在向Consumer投遞成功訊息後,訊息仍然需要保留,並且重新消費一般是按照時間維度,例如由於Consumer系統故障,恢復後需要重新消費1小時前的資料,那麼Broker要提供一種機制,可以按照時間維度來回退消費進度。

RocketMQ支援按照時間回溯消費,時間維度精確到毫秒,可以向前回溯,也可以向後回溯。

(12)訊息堆積

訊息中介軟體的主要功能是非同步解耦,還有個重要功能是擋住前端的資料洪峰,保證後端系統的穩定性,這就要求訊息中介軟體有一定的訊息堆積能力,訊息堆積分以下兩種情況:
(a)訊息堆積在記憶體Buffer,一旦超過記憶體Buffer,可以根據一定的丟棄策略來丟棄訊息。

(b)訊息堆積到持久化儲存系統中,例如DB,KV,檔案記錄形式。

當訊息不能在記憶體cache命中時,要不可避免的訪問磁碟,會產生大量讀IO,讀IO的吞吐量直接決定了訊息堆積後的訪問能力

(13)分散式事務

分散式事務涉及到兩階段提交問題,在資料儲存方面必然需要支援KV儲存的支援,因為第二階段的提交回滾需要修改訊息狀態,一定涉及到根據key去查詢Message動作,RocketMQ在第二階段繞過了根據key去查詢Message的問題,採用第一階段傳送Prepared訊息時,拿到了訊息的offset,第二階段通過offset去訪問訊息,並修改狀態,offset就是資料的地址。

RocketMQ這種實現事務方式,沒有通過KV儲存做,而是通過offset方式,存在一個顯著的缺陷,即通過offset更改資料,會令系統的髒頁過多,需要特別關注。

(14)定時訊息

定時訊息指訊息傳送到Broker後,不能立刻被Consumer消費,要到特定的時間點或者特定的時間後才能被消費。

如果要支援任意的時間精度,在Broker層面,必須要做訊息排序,如果在涉及到持久化,那麼訊息排序要不可避免產生巨大效能開銷。

RocketMQ支援定時訊息,但是不支援任意時間精度,支援特定的level1

(15)訊息重試

Consumer消費訊息失敗後,要提供一種重試機制,令訊息在消費一次,consumer消費訊息失敗通常可以認為以下幾種情況:

1、由於訊息本身的原因,例如反序列化失敗,訊息資料本身無法處理(如充話費,當前訊息的手機號被登出,無法充值),這種錯誤通常需要跳過這條訊息,再消費其他訊息,而這條失敗的訊息即使立刻重試消費,99%也不成功,所以最好提供一種定時重試機制,即過10s在重試。

2、由於依賴的下游應用服務不可用,例如db連線不可用,外系統網路不可到達

遇到這種錯誤,即使跳過當前失敗訊息,消費其他訊息同樣也會報錯,這種情況建議應用sleep 30s,再消費下一條訊息,這樣可以減輕Broker重試訊息的壓力。

相關推薦

訊息中介軟體需要解決哪些問題

(1)Publis/Subscribe 釋出訂閱是訊息中介軟體的最基本功能,是相對於傳統的RPC通訊而言。 (2)Message Priority 規範中描述的優先順序是指在一個訊息佇列中,每條訊息都

應用訊息中介軟體設計可以解決哪些實際問題?

訊息佇列中介軟體是分散式系統中重要的元件,主要解決應用解耦,非同步訊息,流量削鋒等問題,實現高效能,高可用,可伸縮和最終一致性架構。目前使用較多的訊息佇列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。訊息中介軟體到底該如何使用,何時使用這是一

訊息中介軟體(一)分散式系統事務一致性解決方案大對比,誰最好使?(轉)

原文轉載至:https://blog.csdn.net/lovesomnus/article/details/51785108   在分散式系統中,同時滿足“一致性”、“可用性”和“分割槽容錯性”三者是不可能的。分散式系統的事務一致性是一個技術難題,各種解決方案孰優孰劣? 在OLTP系統領域,

訊息中介軟體解決方案-JMS-ActiveMQ

一、JMS入門   1.1 JMS簡介   JMS是Java平臺上有關面向訊息中介軟體的技術規範,它本身只定義了一系列的介面規範,是一種與廠商無關的API,用來訪問訊息收發系統。訊息是JMS中的一種型別物件,由兩部分組成:報頭和訊息主體。報頭由路由資訊以及有關該訊息的元資料組成。訊息主體則攜帶者應用程式的

電商專案day13(訊息中介軟體解決方案 JMS&ActiveMQ)

今日目標: 配置nginx反向代理 jms入門 spring整合jms ActiveMQ應用到專案實現上下架同時更改索引庫以及靜態頁面 一.nginx配置專案的反向代理 nginx是什麼? Nginx (engine x) 是一個高效能的HTTP和反向代理服

訊息中介軟體(一)分散式系統事務一致性解決方案大對比,誰最好使?

在分散式系統中,同時滿足“一致性”、“可用性”和“分割槽容錯性”三者是不可能的。分散式系統的事務一致性是一個技術難題,各種解決方案孰優孰劣? 在OLTP系統領域,我們在很多業務場景下都會面臨事務一致性方面的需求,例如最經典的Bob給Smith轉賬的案例。傳統的企業開發,

訊息中介軟體保證訊息一致性解決方案

1、訊息中介軟體的應用場景 (1)非同步通訊 (2)解耦 (3)併發緩衝 2、訊息傳送和投遞的不可靠性 (1)分散式網路進行就引入了資料傳輸的不確定性 (2)也就是CAP理論中的P(分割槽容錯性) (3)跨網路通訊產生了分散式事務問題 3、訊息傳

一道面試題 訊息中介軟體,怎麼解決訊息的冪等性(訊息怎麼防止不被重複消費)

訊息中介軟體中,怎麼解決訊息的冪等性(訊息消費怎麼防止不被重複消費。) 如果SpringBoot和ActiveMQ整合,程式碼不拋異常,標識為消費成。 ActiveMQ 消費程式碼丟擲異常,就會一直重試(10次)。 消費者端丟擲異常,怎麼解決 日誌mongdb(json)、redis、資

Java訊息中介軟體ActiveMQ-5.11.1啟動失敗解決辦法

異常資訊: Exception thrown from LifecycleProcessor on context close | org.apache.activemq.xbean.XBeanBrokerFactory$1 | WrapperSimpleAppMain j

解決mq訊息一致性-訊息中介軟體(一)

定義:產生訊息的業務動作和訊息傳送的一致。 如果業務動作執行成功了,那麼這個動作產生的訊息一定要傳送出去。另一方面,如果這個業務沒有發生或者失敗,就不應該把訊息傳送出去。 執行具體流程 業務處理應用先把訊息傳送給訊息中介軟體,標記訊息狀態為待處理 訊息中

大型網際網路高併發解決方案之訊息中介軟體技術-activeMQ詳解

點選上方藍字關注的都是靚仔和仙女 概述 ActiveMQ是Apache所提供的一個開源的訊息系統,完全採用Java來實現,因此,它能很好地支援J2EE提出的JMS(Java Message Service,即Java訊息服務)規範。JMS是一組Java應用程式介面,它提供訊息的建立、傳送、讀取等一系列服

機器人要取代快遞員,還需要解決哪些問題

快遞員 前段時間亞馬遜申請了兩款追蹤手環專利,目的是為了簡化耗費時間的任務,去指導旗下員工更好地完成訂單。不過,也因此引發了人們對隱私的擔憂,認為亞馬遜是想將員工變得如同機器人一般。而事實上,現在包括亞馬遜、FedEx和DHL等在內的快遞巨頭,都在嘗試擴大機器人的適用範圍,以此來提升工作效率。 自2012 年

訊息中介軟體--RabbitMQ學習(一)

Activemq介紹 Activemq是 Apache出品,最流行的能力強勁的開源訊息匯流排,並且它個完全支援MS規範的訊息中介軟體。 其豐富的AP、多種叢集構建模式使得他成為業界老牌訊息中介軟體,在中小型企業中應用廣泛。 MQ衡量指標:服務效能、資料儲存、叢集架構

訊息中介軟體activeMQ(1)

開篇只是提出了訊息中間的定義,點對點、訂閱兩種模式下的訊息傳輸特點和AactiveMQ中訊息傳遞和接收的流程。 基本概念: MOM 就是面向訊息中介軟體(Message-oriented middleware),是用於以分散式應用或系統中的非同步、鬆耦合、可靠、可擴充套件和安全通訊的一類軟體

RabbitMQ訊息中介軟體技術精講無密完結版

第1章 課程介紹 本章首先讓大家徹底明白為什麼學習RabbitMQ,通過本課程的學習具體收穫有哪些?課程內容具體安排與學習建議,然後為大家簡單介紹下業界主流訊息中介軟體有哪些,各自適用場景等。 1-1 課程導學 1-2 業界主流訊息中介軟體介紹 第2章 低門檻,入門RabbitMQ核心概念 本

交易環節訊息中介軟體設計——去哪兒餘昭輝

交易環節訊息中介軟體 問題考慮 不能丟訊息 丟訊息意味著掉單,意味著支付成功但是沒給人家出票,這是不能接受的。 穩定 訊息中介軟體一旦出問題,交易不能進行,也是嚴重的故障。 效能 典型的訊息中介軟體包含 3 部分 producer(釋出者)、broker(訊息中

(六) 訊息中介軟體——使用 JmsTemplate 向 ActiveMQ 傳送和獲取 Topic 型別訊息

文章目錄 前言 回顧 Queue 型別訊息的傳送和請求過程 ActiveMQTopic 和 JmsTemplate Topic 型別訊息的特性

(五) 訊息中介軟體——使用 JmsTemplate 向 ActiveMQ 獲取 Queue 型別訊息

文章目錄 前言 為什麼不將傳送和接收寫到同一篇文章中? 傳送和接收的聯絡和區別-本質上是對某一個 ActiveMQQueue 的操作 讀取 Queue 中的訊息

(四) 訊息中介軟體——使用 JmsTemplate 向 ActiveMQ 傳送 Queue 型別訊息

文章目錄 前言 傳送類的編寫 建立 類 JmsTemplateQueueProduct 方法一 send 方法二 convertAndS

(二) 訊息中介軟體——ActiveMQ 安裝和啟動

文章目錄 ActiveMQ 有眾多版本 ActiveMQ 支援多個平臺 解壓即安裝 認識預設的兩個埠 啟動 ActiveMQ 訪問 Active