消息發送
普通發送消息,是直接根據topic的queue最終寫入到commitlog的,然后可以被消費者消費。比如現在往broker的orderTopic發送事務,不會先把half消息的offset寫入orderTopic的queue里面去,而是寫入broker內部的“RMQ_SYS_TRANS_HALF_TOPIC”對應的ConsumeQueue里面去。此時消息必然在broker內部了,那就會認為half消息寫入成功了,然后響應給發送者;所以此時消費者還沒發看到這條half消息。
消息確認
然后producer執行完業務邏輯后,就會發送rollback/commit狀態確認。或者網絡故障producer沒有收到half消息的響應、又或者發送rollback/commit失敗,此時broker一直收不到producer的信號,它后台就會回查消息判斷狀態。但是它最多回查15次,15次都沒拿到消息狀態就會將它rollback。
rollback
假設現在消息rollback后,那么消息就要回滾,不過broker不是直接將消息刪除掉,而是通過內部的op_topic標記half消息為rollback。
commit
如果消息commit后,則內部的op_topic標記half消息為commit,然后把消息寫到orderTopic里面去,此時consumer就可以消費了。
。