消息隊列的使用場景是怎樣的?

rebbitmq,activemq
跨系統的異步通信,所有需要異步交互的地方都可以使用消息隊列。就像我們除了打電話(同步)以外,還需要發短信,發電子郵件(異步)的通訊方式。
多個應用之間的耦合,由於消息是平臺無關和語言無關的,而且語義上也不再是函數調用,因此更適合作爲多個應用之間的鬆耦合的接口。基於消息隊列的耦合,不需要發送方和接收方同時在線。
在企業應用集成(EAI)中,文件傳輸,共享數據庫,消息隊列,遠程過程調用都可以作爲集成的方法。
應用內的同步變異步,比如訂單處理,就可以由前端應用將訂單信息放到隊列,後端應用從隊列裏依次獲得消息處理,高峯時的大量訂單可以積壓在隊列裏慢慢處理掉。由於同步通常意味着阻塞,而大量線程的阻塞會降低計算機的性能。
消息驅動的架構(EDA),系統分解爲消息隊列,和消息製造者和消息消費者,一個處理流程可以根據需要拆成多個階段(Stage),階段之間用隊列連接起來,前一個階段處理的結果放入隊列,後一個階段從隊列中獲取消息繼續處理。
應用需要更靈活的耦合方式,如發佈訂閱,比如可以指定路由規則。
跨局域網,甚至跨城市的通訊,比如北京機房與廣州機房的應用程序的通信。

個人認爲消息隊列的主要特點是異步處理,主要目的是減少請求響應時間和解耦。所以主要的使用場景就是將比較耗時而且不需要即時(同步)返回結果的操作作爲消息放入消息隊列。同時由於使用了消息隊列,只要保證消息格式不變,消息的發送方和接收方並不需要彼此聯繫,也不需要受對方的影響,即解耦和。
使用場景的話,舉個例子:
假設用戶在你的軟件中註冊,服務端收到用戶的註冊請求後,它會做這些操作:

校驗用戶名等信息,如果沒問題會在數據庫中添加一個用戶記錄
如果是用郵箱註冊會給你發送一封註冊成功的郵件,手機註冊則會發送一條短信
分析用戶的個人信息,以便將來向他推薦一些志同道合的人,或向那些人推薦他
發送給用戶一個包含操作指南的系統通知
等等……

但是對於用戶來說,註冊功能實際只需要第一步,只要服務端將他的賬戶信息存到數據庫中他便可以登錄上去做他想做的事情了。至於其他的事情,非要在這一次請求中全部完成麼?值得用戶浪費時間等你處理這些對他來說無關緊要的事情麼?所以實際當第一步做完後,服務端就可以把其他的操作放入對應的消息隊列中然後馬上返回用戶結果,由消息隊列異步的進行這些操作。

或者還有一種情況,同時有大量用戶註冊你的軟件,再高併發情況下注冊請求開始出現一些問題,例如郵件接口承受不住,或是分析信息時的大量計算使cpu滿載,這將會出現雖然用戶數據記錄很快的添加到數據庫中了,但是卻卡在發郵件或分析信息時的情況,導致請求的響應時間大幅增長,甚至出現超時,這就有點不划算了。面對這種情況一般也是將這些操作放入消息隊列(生產者消費者模型),消息隊列慢慢的進行處理,同時可以很快的完成註冊請求,不會影響用戶使用其他功能。

所以在軟件的正常功能開發中,並不需要去刻意的尋找消息隊列的使用場景,而是當出現性能瓶頸時,去查看業務邏輯是否存在可以異步處理的耗時操作,如果存在的話便可以引入消息隊列來解決。否則盲目的使用消息隊列可能會增加維護和開發的成本卻無法得到可觀的性能提升,那就得不償失了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章