1. 程式人生 > >ActiveMQ訊息傳送和確認機制

ActiveMQ訊息傳送和確認機制

ActiveMQ訊息傳送機制

Producer客戶端使用來發送訊息的, Consumer客戶端用來消費訊息;
它們的協同中心就是ActiveMQ broker,broker也是讓producer和consumer呼叫過程解耦的工具,最終實現了非同步RPC/資料交換的功能。
隨著ActiveMQ的不斷髮展,支援了越來越多的特性,也解決開發者在各種場景下使用ActiveMQ的需求。
比如producer支援非同步呼叫;
使用flow control機制讓broker協同consumer的消費速率;
consumer端可以使用prefetchACK來最大化訊息消費的速率;
提供"重發策略"等來提高訊息的安全性等。
一條訊息從producer端發出之後,一旦被broker正確儲存,那麼它將會被consumer消費,然後ACK,broker端才會刪除不過當訊息過期或者儲存裝置溢位時,也會終結它。

網上一張圖:詳細說明了這個過程:


上面的圖裡面寫的很清晰。

上半部分是producer的流程,下半部分consumer的流程分為兩塊,同步的consumer.receive和非同步的MessageListener。從圖中可以看出非同步的MessageLister也是一條一條處理的,由delivered佇列控制的

這張圖片中簡單的描述了:1)producer端如何傳送訊息 2) consumer端如何消費訊息 3) broker端如何排程。
如果用文字來描述圖示中的概念,恐怕一言難盡。
圖示中,提及到prefetchAck,以及訊息同步、非同步傳送的基本邏輯;這對你瞭解下文中的ACK機制將有很大的幫助。

ACK模式與型別介紹:

Consumer消費訊息的風格有2種: 同步/非同步. 使用consumer.receive()就是同步,使用messageListener就是非同步。

在同一個consumer中,我們不能同時使用這2種風格,比如在使用listener的情況下,當呼叫receive()方法將會獲得一個Exception。

兩種風格下,訊息確認時機有所不同。

同步呼叫時,在訊息從receive方法返回之前,就已經呼叫了ACK;因此如果Client端沒有處理成功,此訊息將丟失(可能重發,與ACK模式有關)。
基於非同步呼叫時,訊息的確認是在onMessage方法返回之後,如果onMessage方法異常,會導致訊息不能被ACK,會觸發重發

ACK模式詳解:

AUTO_ACKNOWLEDGE :

自動確認,這就意味著訊息的確認時機將有consumer擇機確認.
"擇機確認"似乎充滿了不確定性,這也意味著,開發者必須明確知道"擇機確認"的具體時機,否則將有可能導致訊息的丟失,或者訊息的重複接收.
當我們使用messageListener方式消費訊息時,通常建議在onMessage方法中使用try-catch,這樣可以在處理訊息出錯時記錄一些資訊,
而不是讓consumer不斷去重發訊息;
如果你沒有使用try-catch,就有可能會因為異常而導致訊息重複接收的問題,需要注意你的onMessage方法中邏輯是否能夠相容對重複訊息的判斷

CLIENT_ACKNOWLEDGE : 

客戶端手動確認,這就意味著AcitveMQ將不會“自作主張”的為你ACK任何訊息,開發者需要自己擇機確認。
無論是“同步”/“非同步”,ActiveMQ都不會發送STANDARD_ACK_TYPE,直到message.acknowledge()呼叫。
如果在client端未確認的訊息個數達到prefetchSize * 0.5時,會補充發送一個ACK_TYPE為DELIVERED_ACK_TYPE的確認指令,
這會觸發broker端可以繼續push訊息到client端。

DUPS_OK_ACKNOWLEDGE :

"訊息可重複"確認,意思是此模式下,可能會出現重複訊息,並不是一條訊息需要傳送多次ACK才行。
它是一種潛在的"AUTO_ACK"確認機制,為批量確認而生,而且具有“延遲”確認的特點。
對於開發者而言,這種模式下的程式碼結構和AUTO_ACKNOWLEDGE一樣,不需要像CLIENT_ACKNOWLEDGE那樣呼叫acknowledge()方法來確認訊息。

SESSION_TRANSACTED :

當session使用事務時,就是使用此模式。

在事務開啟之後,和session.commit()之前,所有消費的訊息,要麼全部正常確認,要麼全部redelivery。
這種嚴謹性,通常在基於GROUP(訊息分組)或者其他場景下特別適合。

INDIVIDUAL_ACKNOWLEDGE :

很少使用,它的確認時機和CLIENT_ACKNOWLEDGE幾乎一樣

當訊息消費成功之後,需要呼叫message.acknowledege來確認此訊息(單條),
而CLIENT_ACKNOWLEDGE模式先message.acknowledge()方法將導致整個session中所有訊息被確認(批量確認)

相關推薦

ActiveMQ訊息傳送確認機制

ActiveMQ訊息傳送機制:Producer客戶端使用來發送訊息的, Consumer客戶端用來消費訊息; 它們的協同中心就是ActiveMQ broker,broker也是讓producer和consumer呼叫過程解耦的工具,最終實現了非同步RPC/資料交換的功能。 隨

ActiveMQ訊息傳送機制以及ACK機制詳解 AcitveMQ是作為一種訊息儲存分發元件,涉及到client與broker端資料互動的方方面面,它不僅要擔保訊息的儲存安全性,還要提供額外的

    AcitveMQ是作為一種訊息儲存和分發元件,涉及到client與broker端資料互動的方方面面,它不僅要擔保訊息的儲存安全性,還要提供額外的手段來確保訊息的分發是可靠的。 一. ActiveMQ訊息傳送機制     Producer客戶端使用來發送訊息的, Consumer客戶端用來消費

activemq中的訂閱模式以及訊息時長確認機制

直接上程式碼 釋出主題 package com.activemq; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class TopicPub {

activemq訂閱模式以及訊息時長確認機制

程式碼如下: package com.activemq;   import org.apache.activemq.ActiveMQConnectionFactory;   import ja

ActiveMQ訊息傳送機制以及ACK機制詳解

AcitveMQ是作為一種訊息儲存和分發元件,涉及到client與broker端資料互動的方方面面,它不僅要擔保訊息的儲存安全性,還要提供額外的手段來確保訊息的分發是可靠的。   一. ActiveMQ訊息傳送機制     Producer客戶端使用來發送訊息的, Cons

ActiveMQ訊息傳送機制以及ACK機制

    AcitveMQ是作為一種訊息儲存和分發元件,涉及到client與broker端資料互動的方方面面,它不僅要擔保訊息的儲存安全性,還要提供額外的手段來確保訊息的分發是可靠的。 一. ActiveMQ訊息傳送機制     Producer客戶端使用來發送訊息的, Consumer客戶端用來消費

SpringBoot整合ActiveMQ訊息佇列雙向佇列、點對點與釋出訂閱

ActiveMQ 是Apache出品,最流行的,能力強勁的開源訊息匯流排。ActiveMQ 是一個完全支援JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。 &nbs

OC的訊息傳送以及轉發機制

SEL:Objective-C在編譯時,會依據每一個方法的名字、引數序列,生成一個唯一的整型標識(Int型別的地址),這個標識就是SEL.本質上,SEL只是一個指向方法的指標. Method:Method = SEL + IMP + method_types,相當於在SEL和IMP之間建立

SpringBoot整合RabbitMQ,實現訊息傳送消費

下載安裝Erlang和RabbitMQ Erlang和RabbitMQ:https://www.cnblogs.com/theRhyme/p/10069611.html   專案建立和依賴 推薦SpringCloud專案線上建立:https://start.spring.io/ 不用上面這

Springboot 2.0.x 簡單整合Rabbit MQ 並實現訊息傳送消費【Windows 環境下】

文章目錄 Springboot 2.0.x 簡單整合Rabbit MQ 並實現訊息傳送和消費【Windows 環境下】 1、rabbit mq 基礎支援,安裝 Erlang 環境 2、安裝 ra

java實現kafka訊息傳送接收

之前寫了一篇關於kafka叢集搭建的點選開啟連結。想了解的可以看下。今天這個實現是和前面叢集對應的。使用的是新版的API。屬性如果想定製自己的,需要到官方網址上面去檢視一下對應的值。推介大家多去看看官方的介紹和demo。網上有些翻譯過來的例子並不完善,最好是知己知彼,才能百戰

RabbitMQ 相關問題總結--RabbitMQ 如何確保訊息傳送消費?

RabbitMQ 相關問題總結 HA 的RabbitMQ 叢集架構: 一、RabbitMQ 如何高可用部署,如何確保叢集不宕機? RabbitMQ可用採用三種方式來部署叢集: 1. cluster      a. 不支援跨網段,用於同一個網段內的區域網。     b.

runtime從入門到精通(五)—— 訊息傳送訊息轉發

前一篇文章中,我們介紹了runtime相關的術語的資料結構,檢視連結:runtime相關的術語的資料結構。本文主要講解與runtime相關的訊息傳送和訊息轉發兩個重要模組。 訊息傳送 訊息傳送舉例:下面這個OC程式碼 [person read:book

同步方式的訊息傳送非同步方式的訊息傳送

通訊有兩類不同的基本方式: 具有依時性的同步方式以及與時間無關的非同步方式。訊息傳送中介軟體有許多不同型別, 它們分別都能夠支援一類基本方式的訊息通訊, 有時可以支援兩類方式。 根據定義, 同步執行的特徵為: 在兩個通訊應用系統之間必須要進行同步, 兩個系統必須都在正

Android中基於ServerSocket的實際使用與簡單介紹(內附一個PC端群控多臺手機的訊息傳送接收Demo)

一、要想將ServerSocket整明白首先至少先要知道或是瞭解幾點基礎內容部分(大神或是有一定能力的小神跳過): 1.ServerSocket是需要在服務端定義書寫的而在客戶端不需要ServerSocket,客戶端只需要建立socket就可以了。 2.socket需要在子

JMS訊息傳送接收例項

傳送訊息 不管是將訊息傳送到佇列還是釋出到主題,程式設計的步驟是相同的,差別在於使用不同的JMS物件。具體定義見表: 傳送訊息的過程大體分為以下幾步; 1、獲得一個Weblogic Server上下文的引用; 2、建立連線工廠; 3、使用連線工廠建立一個連線; 4、使用連

伺服器端的訊息分發路由機制

伺服器端的大資料處理和分散式應用,一直是最近幾年很火的框架應用,有很多開源框架,都是針對大資料的處理而設計的,這些資料處理框架能很好的利用叢集中計算機的分佈處理效能。 但是遷移到開源的框架總是有代價的,這涉及到原有的系統升級和新的介面修訂,為了向框架靠攏而靠攏,但很多時候,

Objective-C 訊息傳送與轉發機制原理

原文地址:http://yulingtianxia.com/blog/2016/06/15/Objective-C-Message-Sending-and-Forwarding/#原始碼解析 本文詳細整理了 Cocoa 的 Runtime 系統的知識,它使得 Objec

rabbitmq訊息傳送確認消費訊息手動刪除訊息

0.application.properties新增如下配置 # 訊息傳送至exchange callback spring.rabbitmq.publisher-confirms=true # 訊息傳送至queue 失敗才callback spring.rabbitmq.publi

(六) 訊息中介軟體——使用 JmsTemplate 向 ActiveMQ 傳送獲取 Topic 型別訊息

文章目錄 前言 回顧 Queue 型別訊息的傳送和請求過程 ActiveMQTopic 和 JmsTemplate Topic 型別訊息的特性