訊息佇列MQ

2021-09-17 23:46:17 字數 1561 閱讀 6953

目錄

一、簡介

二、為什麼需要訊息佇列(mq)?

三、介紹      

訊息佇列(message queuing),在電腦科學中,是一種程序間通訊同一程序間不同執行緒的通訊方式。

廣義上講訊息佇列是解決分布式系統中,各個功能模組間的資訊傳遞通訊方式。

與檔案傳輸和rpc相比,訊息佇列具有更好的平台無關性,並能夠很好地支援併發與非同步呼叫。

目前mq的實現有很多種,如rabbitmq,redis,zeromq,activemq,jafka/kafka,msmq等,不同mq的實現往往有不同的適用場景;而且這些實現會分別遵從不同的mq協議,如高階訊息佇列協議amqp(advanced message queuing protocol)。

主要原因是由於在高併發環境下,由於來不及同步處理,請求往往會發生堵塞,比如說,大量的insert,update之類的請求同時到達mysql,直接導致無數的行鎖表鎖,甚至最後請求會堆積過多,從而觸發too many connections錯誤。通過使用訊息佇列,我們可以非同步處理請求,從而緩解系統的壓力。

這個解釋中的「訊息」指的是在兩台計算機間傳送的資料單位。訊息可以非常簡單,例如只包含文字字串;也可以更複雜,可能包含嵌入物件。訊息被傳送到佇列中。

「訊息佇列」是在訊息的傳輸過程中儲存訊息的容器。訊息佇列管理器在將訊息從它的源中繼到它的目標時充當中間人。佇列的主要目的是提供路由並保證訊息的傳遞;如果傳送訊息時接收者不可用,訊息佇列會保留訊息,直到可以成功地傳遞它。

平常在工作中,我們也常用訊息佇列,比如kafka、rabbitmq等,大多數公司基本上都有在用,當然也有使用redis來模擬訊息佇列的,當然那是不建議的方式。

下面根據我平常使用的場景以及網上的資料大體說下訊息佇列的常用場景。

訊息佇列的主要特點是非同步處理,主要目的是減少請求響應時間和解耦。

主要的使用場景就是將比較耗時而且不需要立即生效返回結果的操作,我們把這種操作作為乙個訊息,放到訊息佇列中。處理方可以在任何時候去獲取並處理這條訊息。這裡我們只要保證訊息的格式不變,訊息的傳送方和接收處理方都認識這個訊息,那麼雙方就不需要彼此通訊,即可以完成一件事。

當然,如果我們使用訊息佇列的話,也有許多需要注意的點。比如,訊息的傳送方不需要接收方立即返回處理結果,否則的話只能等待處理結果;比如系統會有短暫的不一致性,傳送方不可預知接收方什麼時間處理完這個訊息。當然,實際生產中還是有需要地方允許這些比如的,所以訊息佇列現在是異常的火爆。

下面舉乙個網上的例子(自我感覺,非常的生動形象):

假設使用者在軟體中註冊,服務端收到使用者的註冊請求後,它會做這些操作:

校驗使用者名稱等資訊,如果沒問題會在資料庫中新增乙個使用者記錄如果是用郵箱註冊會給你傳送一封註冊成功的郵件,手機註冊則會傳送一條簡訊分析使用者的個人資訊,以便將來向他推薦一些志同道合的人,或向那些人推薦他傳送給使用者乙個包含操作指南的系統通知等等……

但是對於使用者來說,註冊功能實際只需要第一步,只要服務端將他的賬戶資訊存到資料庫中他便可以登入上去做他想做的事情了。至於其他的事情,服務端就可以把其他的操作放入對應的訊息佇列中然後馬上返回使用者結果,由訊息佇列非同步的進行這些操作。

MQ訊息佇列

1.解耦 系統a將userid寫到訊息佇列中,系統c和系統d從訊息佇列中拿資料。這樣有什麼好處?系統a只負責把資料寫到佇列中,誰想要或不想要這個資料 訊息 系統a一點都不關心。即便現在系統d不想要userid這個資料了,系統b又突然想要userid這個資料了,都跟系統a無關,系統a一點 都不用改。系...

MQ訊息佇列應用

很榮幸,原來一直聽說的訊息佇列終於在前段時間用到了自己的專案中。為什麼會用到訊息佇列?毫無疑問,當然是傳輸訊息。這裡訊息一般是一串字串,當然,訊息的含義很多,可以是 hello world 可以是 你吃飯了嗎?可以是一串正式的xml報文。也可以是乙個txt檔案或者xml檔案 在用active mq的...

訊息佇列MQ簡介

專案中要用到rabbitmq,領導讓我先了解一下。在之前的公司中,用到過訊息佇列mq,阿里的那款rocketmq,當時公司也做了簡單的技術分享,自己也看了一些部落格。自己在有道雲筆記上,做了一些整理,但後來也就擱在那了。現在有時間,就對mq的一些簡單的概念做下整理吧。rabbitmq的一些介紹,請參...