關於訊息佇列的一些了解

2022-08-09 03:15:07 字數 2370 閱讀 5755

今天看自己的專案,用到的paas其實是中介軟體技術,了解了下什麼是中介軟體,以及訊息中介軟體。

首先理解一下message queue。

在平常的開發中,應用開發人員完全可以通過傳送和接受訊息的方式來方便的與應用程式進行可靠的通訊,並且訊息的處理為我們提供了方便的訊息傳遞和許多業務處理的可靠的防止故障的方法。

但訊息傳遞與傳統的應用程式互動又有區別?最明顯的區別就是實時性了。message queue不適合實時性要求比較高的場景,因為message queue通過非同步的方式與server端進行互動,不用擔心server端的長時間處理過程。

舉個例子,平常的應用程式之間的呼叫大部分都是通過暴漏介面的形式進行相互的呼叫,一旦業務複雜起來,介面之間的管理也會很麻煩。這時候如果通過message queue的方法的話,只要在需要的時候把訊息傳送到queue manage就可以,這時候message queue就成了嫁接各個系統之間的橋梁。

上面也提到了實時性的問題,比如乙個生成報表的功能,為了給使用者更好的體驗度,我們不可能讓使用者等待很長的時間,這時可以把對報表的處理使用mq,客戶端只需要把必要的報表請求和一些必要的報表條件放置到queue中處理,處理好後,再給使用者傳送乙個訊息即可。

下面也簡單的介紹幾個專業的術語?

訊息:兩台計算機之間傳送的資料單位,例如字串、文字等

訊息佇列:訊息的容器,用於在訊息傳遞的過程中儲存訊息的容器,充當訊息源和目標之間的中間橋梁。佇列的只要目的就在於提供路由保證訊息的傳遞。

訊息佇列網路:是指能夠相互之間傳送訊息的一組計算機。網路中不同的計算機在訊息處理過程中扮演者不同的角色,有的是傳送者,有的是接受者。

訊息中介軟體簡介?

上面對訊息佇列有了一定的了解,那麼訊息中介軟體利用高效可靠的訊息傳遞機制進行平台無關的資料交流,並基於資料通訊來進行分布式系統的整合。通過提供訊息傳遞和訊息排隊模型,可以再分布式環境下擴充套件程序間的通訊。

那麼對於訊息中介軟體,常見的角色大致也就有producer(生產者)、consumer(消費者)、broker(中轉角色),有這麼幾個主要的角色,那麼訊息中介軟體能為我們帶來那些功能呢?

1.message priority

producer把訊息傳送給broker來儲存,那麼我們就可以再訊息佇列中對我們的訊息來進行排序,實現不同的優先順序。從而滿足我們複雜的業務需求。

2.message order

訊息排序,有的訊息的處理是需要按照一定的順序進行處理的,比如使用者的建立訂單、訂單付款、訂單完成。那麼對於消費者也需要按照這個流程來消費,否則就沒有意義了。

3.message filter

在訊息對立中,也可以對我們的訊息進行過濾,比如按照訊息型別等條件來過濾

4.message persistence

訊息的持久化,一般有以下幾種方式

(1)持久化到資料庫,比如mysql

(2)持久哈到kv儲存,比如redis

(3)檔案形式持久化

訊息的持久化,防止了系統掛掉後,仍然能夠從之前備份中恢復出來。

5.broker的buffer滿了怎麼辦?

我們知道broker是用來儲存需要處理的訊息,如果訊息過多,導致buffer滿了怎麼辦?

這時候就會採取一定的策略來丟棄已有的訊息。

6.事務的支援

正如上面所談到的訂單的操作,因此訊息中介軟體中也會提供對分布式事務的支援。

7.定時訊息

在實際應用中,有時也會需要定時消費的功能,因此中介軟體中,也會對訊息進行排序,然後實現定時傳送或者消費訊息的業務需求。

8.訊息重試

考慮一下這個問題,如果訊息消費失敗後,怎麼辦,是等待處理這個訊息呢?還是讓消費者在此消費一次呢?通常情況下,採取後者的形式,因為大多數情況下,消費失敗的原因在於該訊息本身的原因,如果在此消費這個訊息的話,還是會出現失敗的情況,因此通常採取在此傳送訊息在此消費訊息的方式。

9.回溯消費

什麼是回溯消費呢?對於已經消費成功的訊息,是不是在broker中就丟棄該訊息呢?顯而易見是不可能的,因此需要中介軟體對該功能支援,支援已經消費的資訊進行時間段內的儲存,等待某一刻內該訊息會被重新消費的可能。

訊息佇列的一些奇葩問題

1 新建立的訊息佇列,兩個任務通訊過程中,乙個傳送訊息佇列,另乙個任務等待訊息佇列的 時候,這個過程一定要配套出現,就是按套路出牌。怎麼說?假如沒有按套路,第一種情況 任務一 osqpostfront str q,s100 傳送了,訊息佇列,勉強程式能跑起來,但這不是 正規出牌套路,你傳送了訊息,沒...

訊息佇列 一 初步了解

佇列的本質生產端public class product 如果不再傳送訊息,關閉producer例項。producer.shutdown 消費端public class consumer 啟動消費者例項 consumer.start system.out.printf consumer starte...

關於qsort函式的一些了解

void qsort void base,nelem,width,cmp base 為要排序陣列的首位址 nelem 為要排序陣列的長度 width 為要排序陣列元素的大小 所佔記憶體空間的大小 簡單示例 對int num 100 中的元素從小到大排序。int num 100 int cmp con...