RabbitMQ事務(wù)

????在使用 RabbitMQ 的時(shí)候,可以通過(guò)消息持久化操作來(lái)解決因?yàn)榉?wù)器的異常崩潰而導(dǎo)致的消息丟失,除此之外,我們還會(huì)遇到一個(gè)問(wèn)題,當(dāng)消息的生產(chǎn)者將消息發(fā)送出去之后,消息到底有沒有正確地到達(dá)服務(wù)器呢?如果不進(jìn)行特殊配置,默認(rèn)情況下發(fā)送消息的操作是不會(huì)返回任何信息給生產(chǎn)者的,也就是默認(rèn)情況下生產(chǎn)者是不知道消息有沒有正確地到達(dá)服務(wù)器。如果在消息到達(dá)服務(wù)器之前已經(jīng)丟失,持久化操作也解決不了這個(gè)問(wèn)題,因?yàn)橄⒏緵]有到達(dá)服務(wù)器,何談持久化?
????RabbitMQ針對(duì)這個(gè)問(wèn)題,提供了兩種解決方式∶
????1.通過(guò)事務(wù)機(jī)制實(shí)現(xiàn);
????2.通過(guò)發(fā)送方確認(rèn)機(jī)制實(shí)現(xiàn)。

事務(wù)機(jī)制

事務(wù)相關(guān)的方法:channel.txSelect channel.txCommit channel.txRollback
channel.txSelect 是將信道設(shè)置成事務(wù)模式,
channel.txCommit 用來(lái)提交事務(wù)
channel.txRollback 用來(lái)回滾事務(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ù)機(jī)制會(huì)大幅降低RabbitMQ的性能,通過(guò)上圖可以看到使用事務(wù)會(huì)比不用事務(wù)多一些發(fā)送請(qǐng)求和恢復(fù)OK的操作。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容