學習RabbitMQ 三 AMQP事務機制

2022-03-05 02:08:02 字數 1574 閱讀 8126

本文**:

在使用rabbitmq的時候,我們可以通過訊息持久化操作來解決因為伺服器的異常奔潰導致的訊息丟失,除此之外我們還會遇到乙個問題,當訊息的發布者在將訊息傳送出去之後,訊息到底有沒有正確到達broker**伺服器呢?如果不進行特殊配置的話,預設情況下發布操作是不會返回任何資訊給生產者的,也就是預設情況下我們的生產者是不知道訊息有沒有正確到達broker的,如果在訊息到達broker之前已經丟失的話,持久化操作也解決不了這個問題,因為訊息根本就沒到達**伺服器,你怎麼進行持久化,那麼這個問題該怎麼解決呢?

rabbitmq為我們提供了兩種方式:

方式一:通過amqp事務機制實現,這也是從amqp協議層面提供的解決方案;

方式二:通過將channel設定成confirm模式來實現;

首先,我們通過例項來看看amqp的事務模式是怎麼使用的:

rabbitmq中與事務機制有關的方法有三個,分別是channel裡面的txselect(),txcommit()以及txrollback(),txselect用於將當前channel設定成是transaction模式,txcommit用於提交事務,txrollback用於回滾事務,在通過txselect開啟事務之後,我們便可以發布訊息給broker**伺服器了,如果txcommit提交成功了,則訊息一定是到達broker了,如果在txcommit執行之前broker異常奔潰或者由於其他原因丟擲異常,這個時候我們便可以捕獲異常通過txrollback回滾事務了;

具體例項:

public

class

producertest

}class

sender

public

void

run()

//提交事務

channel.txcommit();}}

catch

(exception e)

catch

(ioexception e1)

e.printstacktrace();}}

}

在第57行通過channel.txselect方法開啟事務,第64行通過channel.txcommit提交事務,為了模擬broker**伺服器異常奔潰或者發布過程中丟擲異常,我們通過第61行除以0的操作來模擬(實際中第58行的basicpublish方法是有可能會丟擲ioexception異常),在捕獲到異常之後,第69行呼叫了channel.txrollback進行事務回滾操作,執行整個程式你會發現在"confirmqueue"這個佇列中只儲存了一條訊息,因為在59行i等於1的時候,丟擲了異常,呼叫了第69行進行了事務回滾操作;在實際應用中,可以在回滾操作之後進行訊息重發操作;

我們來通過抓包看看程式執行過程中發出了哪些請求:

1:第一條訊息呼叫channel.txselect開啟事務

2:第一條訊息呼叫channel.txcommit提交事務

3:第二條訊息呼叫channel.txselect開啟事務

4:因為除以0的操作程式丟擲異常,執行catch語句中的channel.txrollback回滾事務

熟悉RabbitMQ與AMQP協議

1.訊息佇列的簡介 rabbitmq採用erlang語言開發。erlang語言由ericson設計,專門為開發concurrent和distribution系統的一種語言,在電信領域使用廣泛。otp open telecom platform 作為erlang語言的一部分,包含了很多基於erlang...

RabbitMQ與AMQP協議詳解

生產者傳送訊息到broker server rabbitmq 在broker內部,使用者建立exchange queue,通過binding規則將兩者聯絡在一起。exchange分發訊息,根據型別 binding的不同分發策略有區別。訊息最後來到queue中,等待消費者取走 exchange有多種型...

php 的rabbitmq 擴充套件模組amqp安裝

使用php開發,要使用中間佇列rabbitmq,必須要安裝php的擴充套件模組amqp,伺服器的環境是php7.1.18 centos 6.8,nginx 1.8 使用php的pecl命令 usr local php bin pecl install amqp 安裝amqp 一直報如下錯 check...