ActiveMQ消息中間件的作用以及應用場景
一、ActiveMQ簡介
ActiveMQ是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ是一個完全支持JMS1.1和J2EE1.4規范的JMS Provide實現。盡管JMS規范出台已經是很久的事情了,但是JMS在當今的J2EE應用中仍然扮演這特殊的地位。
二、ActiveMQ應用場景
消息隊列在大型電子商務類網站,如京東、淘寶、去哪兒等網站有這深入的應用。
隊列的主要作用:消除高並發訪問高峰,加快網站的響應速度。
在不使用消息隊列的情況下,用戶的請求數據直接寫入數據庫,在高並發的情況下,對數據庫造成巨大的壓力,同時也使系統響應延遲加劇;
早使用隊列后,用戶的請求發給隊列后立即返回;
例如:當然不能直接給客戶提示訂單提交成功,在淘寶上提示:"您提交了訂單,請等等系統確認"
再由消息隊列的消費者進程從消息隊列中獲取數據庫,異步寫入數據庫。
由於消息隊列的服務處理速度遠快於數據庫,因此用戶的響應延遲可能得到有效改善。
流程圖解,如下圖:
三、消息隊列說明
消息隊列中間是分布式系統中重要的組件,主要解決應用耦合、異步消息、流量消峰等問題;
實現高性能,高可用,可伸縮和最終一致性架構;是大型分布式系統不可缺少的中間件。
目前在生產環境使用較多的消息隊列:ActiveMQ、RabbitMQ、Kafka、ZeroMQ、MetaMQ、RocketMQ等。
四、消息隊列應用場景
1,異步處理
場景說明:用戶注冊后,需要發注冊郵件和注冊短信。傳統的做法有兩種方式:串行方式、並行方式;
(1)串行方式:將注冊信息寫入數據庫成功后,發生注冊郵件,再發生注冊短信。以上三個任務完成后,返回給客戶端。
(2)並行方式:將注冊信息寫入數據庫成功后,發生注冊郵件的同時,發生注冊短信,以上三個任務完成后,返回給客戶端,與串行的差別是,並行的方式可以提高處理時間;
假設三個業務節點每個使用50ms,不考慮網絡等其他開銷,則串行方式的耗時是150ms;並行的耗時是100ms;
因為CPU在單位時間內處理的請求數是一定的,假設CPU 1秒內吞吐量是100次;則串行方式1秒內CPU可以處理的請求量是7次(1000/150);並行方式可處理請求量是10次(1000/100);
綜上所述,傳統的方式系統的性能(並發量、吞吐量、響應時間)會有瓶頸。如何解決這個問題?
引入消息隊列,將不是必須的業務邏輯,異步處理,改造后的架構如下圖:
安裝上述約定,用戶的響應時間相當於是注冊信息寫入數據庫的時間,也是就是50ms.
注冊郵件,發短信寫入消息隊列后,直接放回,因此寫入消息隊列的速度很快,基本可以忽略。
采用消息隊列后用戶的響應數據可能就是50ms。所以基於此架構,系統的吞吐量提高到每秒20QPS;比串行提高了3倍,比並行提高了2倍。
2,應用解耦
場景說明:用戶下單后,訂單系統需要通知庫存系統。傳統的做法:訂單系統調用庫存系統接口。如下圖:
傳統模式的缺點:
1>.假如庫存系統無法訪問,則訂單減庫存將失敗,從而導致訂單失敗;
2>.訂單系統與庫存系統耦合;
如何解決以上問題?引入應用消息隊列后的方案,如下圖:
1>.訂單系統:用戶下單后,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功,請等等物流配送。
2>.庫存系統:訂閱下單的消息,采用拉/推的方式,獲取下單信息,庫存系統根據下單信息,進行庫存操作。
3>.假如在下單時庫存系統不能正常使用,也不影響正常下單。因為下單后,訂單系統寫入消息隊列就不再關系其他的后續操作了,實現訂單系統與庫存系統的應用解耦。
3,流量消峰
流量消峰也是消息隊列中的常用場景,一般在秒數或者團搶活動中使用廣泛。
應用場景:秒數活動,一般因為流量過大,導致流量暴增,應用容易掛掉。為解決這個問題,一般需要在應用前端假如消息隊列。
(1)可以控制活動人數。
(2)可以緩解短時間內高流量壓垮應用;
引入消息隊列:
1>.用戶的請求,服務器接收后,首先寫入消息隊列。假如消息隊列長度超過最大數量,則直接拋棄用戶請求或者跳轉到錯誤頁面;
2>.秒殺業務根據消息隊列的請求信息,再做后續處理;
4,消息通訊
消息通訊是指:消息隊列一般都內置了高效的通訊機制,因此也可以用在純的消息通訊。比如實現點對點的消息隊列或者聊天室等。
(1)點對點通訊
客戶端A和客戶端B使用同一隊列,進行消息通訊。
(2)聊天室通訊(發布訂閱)
客戶端A、客戶端B、客戶端N訂閱同一主題,進行消息發布和接收,實現類是聊天室效果。