6.RabbitMQ--事物

RabbitMQ之消息確認機制

如何防止消息丟失?

如何防止消息是否正確送達?

有些業務場景須要咱們對於消息的冪等性要求是比較高的,須要消息不能丟失,在使用RabbitMQ的時候,咱們能夠經過消息持久化操做來解決由於服務器的異常奔潰致使的消息丟失,除此以外咱們還會遇到一個問題,當消息的發佈者在將消息發送出去以後,消息到底有沒有正確到達broker代理服務器呢?若是不進行特殊配置的話,默認狀況下發布操做是不會返回任何信息給生產者的,也就是默認狀況下咱們的生產者是不知道消息有沒有正確到達broker的,若是在消息到達broker以前已經丟失的話,持久化操做也解決不了這個問題,由於消息根本就沒到達代理服務器,你怎麼進行持久化,那麼這個問題該怎麼解決呢?服務器

RabbitMQ爲咱們提供了兩種方式:性能

  • 經過AMQP事務機制實現,這也是AMQP協議層面提供的解決方案;
  • 經過將channel設置成confirm模式來實現;


事務機制
這裏首先探討下RabbitMQ事務機制。spa

  RabbitMQ中與事務機制有關的方法有三個:代理

  • txSelect();txSelect用於將當前channel設置成transaction模式,
  • txCommit();txCommit用於提交事務,
  • txRollback(); txRollback用於回滾事務, 

在經過txSelect開啓事務以後,咱們即可以發佈消息給broker代理服務器了,若是txCommit提交成功了,則消息必定到達了broker了,若是在txCommit執行以前broker異常崩潰或者因爲其餘緣由拋出異常,這個時候咱們即可以捕獲異常經過txRollback回滾事務了code

1 channel.txSelect();
2 channel.basicPublish(ConfirmConfig.exchangeName, ConfirmConfig.routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, ConfirmConfig.msg_10B.getBytes());
3 channel.txCommit();

 

  • 事務確實可以解決producer與broker之間消息確認的問題,只有消息成功被broker接受,事務提交才能成功,不然咱們即可以在捕獲異常進行事務回滾操做同時進行消息重發;
  • 可是使用事務機制的話會下降RabbitMQ的性能,那麼有沒有更好的方法既能保障producer知道消息已經正確送到,又能基本上不帶來性能上的損失呢?從AMQP協議的層面看是沒有更好的方法,可是RabbitMQ提供了一個更好的方案,即將channel信道設置成confirm模式(關於confirm模式,親參照下一節內容)。
相關文章
相關標籤/搜索