????在使用 RabbitMQ 的時候,可以通過消息持久化操作來解決因為服務(wù)器的異常崩潰而導(dǎo)致的消息丟失,除此之外,我們還會遇到一個問題,當消息的生產(chǎn)者將消息發(fā)送出去之后,消息到底有沒有正確地到達服務(wù)器呢?如果不進行特殊配置,默認情況下發(fā)送消息的操作是不會返回任何信息給生產(chǎn)者的,也就是默認情況下生產(chǎn)者是不知道消息有沒有正確地到達服務(wù)器。如果在消息到達服務(wù)器之前已經(jīng)丟失,持久化操作也解決不了這個問題,因為消息根本沒有到達服務(wù)器,何談持久化?
????RabbitMQ針對這個問題,提供了兩種解決方式∶
????1.通過事務(wù)機制實現(xiàn);
????2.通過發(fā)送方確認機制實現(xiàn)。
事務(wù)機制
事務(wù)相關(guān)的方法:channel.txSelect channel.txCommit channel.txRollback
channel.txSelect 是將信道設(shè)置成事務(wù)模式,
channel.txCommit 用來提交事務(wù)
channel.txRollback 用來回滾事務(wù)
事務(wù)正常提交
channel.txSelect();
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, false, MessageProperties.PERSISTENT_TEXT_PLAIN,"message".getBytes());
channel.txCommit();

image.png
事務(wù)回滾
try {
channel.txSelect();
channel.basicPublish(exchange,routingKey,MessageProperties.PERSISTENT_TEXT_PLAIN,msg.getBytes());
int result = 1 / 0;
channel.txCommit();
} catch (Exception e) {
e.printStackTrace();
channel.txRollback();
}

image.png
????使用事務(wù)機制會大幅降低RabbitMQ的性能,通過上圖可以看到使用事務(wù)會比不用事務(wù)多一些發(fā)送請求和恢復(fù)OK的操作。