activeMQ簡介
activeMQ是Apache開源基金會研發的消息中間件。是完全支持JMS1.1和J2EE1.4規範的JMS provider實現。
activeMQ主要應用在分佈式系統架構中,幫助構建高可用、高性能、可伸縮的企業級面向消息服務的系統。
activeMQ使用場景
異步消息
異步消息:用戶在網站上填寫基本信息註冊之後,網站對用戶信息保存到數據庫、發送註冊郵件、發送註冊短信通知
在沒有引入中間件的時候,如上操作將是一個串行的操作,服務器將註冊信息進行保存之後進行發送郵件通知最後發送註冊短信。
在使用消息中間件之後,如上操作在註冊信息寫入數據看之後,註冊郵件的發送及註冊消息的發送將異步同時分別執行。
應用解耦
應用解耦:商品下訂單之後,對應庫存數量減少。
在沒有引入中間件的時候,整個操作有可能是在一個方法裏進行實現,下單訂單之後,進行減少庫存操作。 這個情況下如果減庫存操作失敗,會強關聯下單也是失敗的回滾操作。
對於不需要強關聯的場景下,即下單成功後可以通過消息異步通知減少庫存的操作。使二者解耦。
這裏緊緊是一個類比操作,在實際應用中訂單和庫存還是緊密關聯的。
流量削峯
流量削峯:在秒殺活動中,在短時間內流量會比較大,那麼我們需要對這些流量做處理,防止流量暴增致使服務掛掉。
使用消息隊列接口用戶的請求,然後秒殺業務根據規則去讀取消息隊列中的用戶請求的消息然後再去處理
JMS規範
activeMQ是完全支持JMS規範的實現。那JMS是什麼?
Java消息服務(Java message service)是Java平臺中關於面向消息中間件的API,用於在兩個應用程序之間,或者分佈式系統中發送消息,進行異步通信。
JMS是一個與具體平臺無關的API,絕大多數MOM(message oriented middleware)(面向消息中間件)提供商都對JMS提供了支持。
其他開源的JMS提供商
JbossMQ(jboss4)、jboss messaging(jboss5)、joram、ubermq、mantamq
常用術語
在提到JMS時,通常會說到一些術語:
- 消息中間件(JMS Provider):指提供了對JMS協議支持的第三方組件,比如activeMQ就是一個消息中間件,比較知名的還有KFA,rabbitMQ等
- 消息傳遞域(JMS domains):分爲點對點(point-to-point)和發佈/訂閱(pub/sub)
- 消息(JMS message):通信內容的載體,其結構主要分爲消息頭、屬性和消息體
- 消息生產者(JMS producer):產生消息的一方,在p2p模式下指消息的發送者(sender),在p/s模式下指消息發佈者(publisher)
- 消息消費者(JMS consumer):消息接收的一方,在p2p模式下指消息的接受者(receiver)和消息訂閱着(subscriber)
消息傳遞域
JMS有兩種消息傳遞域,即有兩種消息模型:
Point-to-Point(P2P)
1.P2P模式效果圖
2.P2P的特點
- 每個消息只有一個消費者即一旦被消費,消息就不再在消息隊列中
- 提供者和消費者之間在時間上沒有依賴性,也就是說當提供者發送了消息之後,不管消費者有沒有正在運行,它不會影響到消息被髮送到隊列
- 每條消息僅會傳送給一個消費者。可能會有多個消費者在一個隊列中偵聽,但是每個隊列中的消息只能被隊列中的一個消費者所消費。
- 消息存在先後順序。一個隊列會按照消息服務器將消息放入隊列中的順序,把它們傳送給消費者。當已被消費時,就會從隊列頭部將它們刪除(除非使用了消息優先級)
- 消費者在成功接收消息之後需向隊列應答成功
Publish/Subscribe(Pub/Sub)
1.Pub/Sub模式效果圖
2.Pub/Sub(發佈/訂閱模式)的特點
- 每個消息可以有多個消費者
- 發佈者和訂閱者之間有時間上的依賴性。針對某個主題的訂閱者,它必須創建一個訂閱者之後,才能消費發佈者的消息,而且爲了消費消息,訂閱者必須保持運行的狀態
- 爲了緩和這樣嚴格的時間相關性,JMS允許訂閱者創建一個可持久化的訂閱,這樣,即使訂閱者沒有被激活(運行),它也能接收到發佈者的消息
- 每條消息都會傳送給稱爲訂閱者的多個消息消費者。訂閱者有許多類型,包括持久型、非持久型和動態型
- 發佈者通常不會知道、也意識不到哪一個訂閱者正在接收主題消息
- 消息被推送給消費者,這意味着消息會傳送給消費者,而無須請求
ConnectionFactory(連接工廠)
創建Connection對象的工廠,根據消息類型的不同,用戶將使用隊列連接工廠,或者主題連接工廠分別有QueueConnectionFactory和TopicConnectionFactory兩種。
Connection(連接)
Connection表示在客戶端和JMS系統之間建立的鏈接(對TCP/IP socket的包裝)。Connection可以產生一個或多個Session。跟ConnectionFactory一樣,Connection也有兩種類型:QueueConnection和TopicConnection。
Session(會話)
Session是我們操作消息的接口。表示一個單線程的上下文,用於發送和接收消息。由於會話是單線程的,所以消息是連續的,就是說消息是按照發送的順序一個一個接收的。可以通session創建生產者、消費者、消息等。Session提供了事務的功能。當我們需要使session發送/接收多個消息時,可以將這些發送/接收動作放到一個事務中。同樣,也分QueueSession和TopicSession。
Destination(目標)
Destination是一個包裝了消息目標標識符的被管對象,消息目標是指消息發佈和接收的地點,或者是隊列,或者是主題。是消息生產者的消息發送目標或者說消息消費者的消息來源。對於消息生產者來說,它的Destination是某個隊列(Queue)或某個主題(Topic),對於消息消費者來說,它的Destination也是某個隊列或主題(即消息來源)。所以,Destination實際上就是兩種類型的對象:Queue、Topic。
MessageProducer(消息的生產者)
消息生產者由Session創建,並用於將消息發送到Destination。消費者可以同步地(阻塞模式),或異步(非阻塞)接收隊列和主題類型的消息。同樣,消息生產者分兩種類型:QueueSender和TopicPublisher。可以調用消息生產者的方法(send或publish方法)發送消息。
MessageConsumer(消息消費者)
消息消費者由Session創建,用於接收被髮送到Destination的消息。兩種類型:QueueReceiver和TopicSubscriber。可分別通過session的createReceiver(Queue)或createSubscriber(Topic)來創建。當然,也可以session的creatDurableSubscriber方法來創建持久化的訂閱者
Message(消息)
是在消費者和生產者之間傳送的對象,也就是說從一個應用程序創送到另一個應用程序。一個消息有三個主要部分:
- 消息頭(必須):包含用於識別和爲消息尋找路由的操作設置
- 一組消息屬性(可選):包含額外的屬性,支持其他提供者和用戶的兼容。可以創建定製的字段和過濾器(消息選擇器)。
- 一個消息體(可選):允許用戶創建五種類型的消息(文本消息,映射消息,字節消息,流消息和對象消息)