說ActiveMQ以前,不得不說一下 JMS。JMS即Java消息服務(Java Message Service)應用程序接口,是一個Java平臺中關於面向消息中間件(MOM)的API,用於在兩個應用程序之間,或分佈式系統中發送消息,進行異步通訊。java
JMS 使您可以經過消息收發服務(有時稱爲消息中介程序或路由器)從一個 JMS 客戶機向另外一個 JMS客戶機發送消息。消息是 JMS 中的一種類型對象,由兩部分組成:報頭和消息主體。報頭由路由信息以及有關該消息的元數據組成。消息主體則攜帶着應用程序的數據或有效負載。web
根據有效負載的類型來劃分,能夠將消息分爲幾種類型,它們分別攜帶:簡單文本(TextMessage)、可序列化的對象 (ObjectMessage)、屬性集合 (MapMessage)、字節流 (BytesMessage)、原始值流 (StreamMessage),還有無有效負載的消息 (Message)。redis
消息隊列有無數開源實現,通常不必本身實現。zmq也好rabbitmq也好甚至redis也好,找一個合適的裝上用就行就好像rdbms/nosql同樣。技術都是解決問題的,消息隊列解決的是將突發大量請求轉換爲後端能承受的隊列請求,好比你的服務器一秒能處理100個訂單,但秒殺活動1秒進來1000個訂單,持續10秒,在後端能力沒法增長的狀況下,你能夠用消息隊列將總共10000個請求壓在隊列裏,後臺consumer按原有能力處理,100秒後處理完全部請求(而不是直接宕機丟失訂單數據)。sql
來個我的通俗的解釋吧。數據庫
消息隊列,顧名思義 首先是個隊列隊,列的操做有入隊和出隊,也就是你有一個程序在產生內容而後入隊(生產者) 另外一個程序讀取內容,內容出隊(消費者)這是最最基本的概念。當你不須要當即得到結果,可是併發量又不能無限大的時候,差很少就是你須要使用消息隊列的時候。好比你寫日誌,由於可能一個客戶端有多個操做去寫,又有不少個客戶端,顯然併發不能無窮大,因而你就須要把寫日誌的請求放入到消息隊列裏,在消費者那邊依次把隊列中產生的日誌寫到數據庫裏。至於怎麼實現消息隊列,其實你自己一個普通的隊列就行呀~看你須要什麼附加功能而已。後端
消息隊列在大型電子商務類網站,如京東、淘寶、去哪兒等網站有這深刻的應用,隊列的主要做用是消除高併發訪問高峯,
加快網站的響應速度。在不使用消息隊列的狀況下,用戶的請求數據直接寫入數據庫,在高併發的狀況下,
會對數據庫形成巨大的壓力,同時也使得系統響應延遲加重。在使用隊列後,用戶的請求發給隊列後當即返回
(固然不能直接給用戶提示訂單提交成功,京東上提示:您「您提交了訂單,請等待系統確認」),
再由消息隊列的消費者進程從消息隊列中獲取數據,異步寫入數據庫。因爲消息隊列的服務處理速度遠快於數據庫,
所以用戶的響應延遲可獲得有效改善。服務器
消息中間件通常被用在異步消息通訊、整合多個系統的場景,好比你註冊CSDN論壇,你填寫完註冊信息點提交時,它會發一份驗證郵箱的驗證郵件給到你,這封郵件就能夠經過消息中間異步發送給你。再舉一個場景,原先有一個客戶購買咱們的工做管理平臺,他用該平臺模擬公司整個行政辦公,業務流程,前提是把他原先的財務系統相關數據以單據的形式也要在咱們的平臺上走流程。這就涉及到數據整合問題了,固然解決方法有不少種,一種方法是能夠經過在財務系統開發一個webservice接口,而後管理平臺去訪問該接口,也能夠直接經過quartz作一個計劃,不定時的去取相關數據,固然也能夠在管理平臺與財務系統之間弄一個消息總線,財務系統產生數據時,發送一份到消息中間件,而後管理平臺去取。用消息中間件的好處是不只數據實時性高,並且讓管理平臺與財務系統之間解耦了,未來生管系統有什麼數據要走流程,也能夠這樣作。併發
在項目中,將一些無需即時返回且耗時的操做提取出來,進行了異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提升了系統的吞吐量。異步
若是系統生態環境很單一,無需跟其餘第三方進行通訊,或是雖然要簡單的通訊可是數據量不大,業務不太複雜,其實我的認爲是無需用MQ這種重量級的解決方案的,直接暴露接口就行了,總之就是一個權衡了。nosql
JMS對象模型包含以下幾個要素:
1)鏈接工廠。鏈接工廠(ConnectionFactory)是由管理員建立,並綁定到JNDI樹中。客戶端使用JNDI查找鏈接工廠,
而後利用鏈接工廠建立一個JMS鏈接。
2)JMS鏈接。JMS鏈接(Connection)表示JMS客戶端和服務器端之間的一個活動的鏈接,是由客戶端經過調用鏈接工廠的方法創建的。
3)JMS會話。JMS會話(Session)表示JMS客戶與JMS服務器之間的會話狀態。JMS會話創建在JMS鏈接上,表示客戶與服務器之間的一個會話線程。
4)JMS目的。JMS目的(Destination),又稱爲消息隊列,是實際的消息源。
5)JMS生產者和消費者。生產者(Message Producer)和消費者(Message Consumer)對象由Session對象建立,用於發送和接收消息。
6)JMS消息一般有兩種類型:
① 點對點(Point-to-Point)。在點對點的消息系統中,消息分發給一個單獨的使用者。點對點消息每每與隊列(javax.jms.Queue)相關聯。
② 發佈/訂閱(Publish/Subscribe)。發佈/訂閱消息系統支持一個事件驅動模型,消息生產者和消費者都參與消息的傳遞。生產者發佈事件, 而使用者訂閱感興趣的事件,並使用事件。該類型消息通常與特定的主題(javax.jms.Topic)關聯。