RocketMQ使用淺析(二)
上篇文章介紹了RocketMQ的構(gòu)成與消息發(fā)送方式,接下來我們繼續(xù)RocketMQ的消費(fèi)模式、事務(wù)消息與持久化。上一篇文章請(qǐng)看:RocketMQ使用淺析(一)
RocketMQ消費(fèi)方式
1.推模式
RocketMQ服務(wù)器主動(dòng)給客戶端推送消息,當(dāng)客戶端連接到服務(wù)器時(shí),服務(wù)器會(huì)hold這個(gè)連接一段時(shí)間,這個(gè)時(shí)間如果有新消息到達(dá),會(huì)通過hold的這個(gè)連接通道直接返回給客戶端,消息推送非常及時(shí),但是對(duì)于服務(wù)端的壓力比較大

2.拉模式
客戶端通過長(zhǎng)輪詢主動(dòng)去拉服務(wù)端的消息,可以自主控制消息的消費(fèi)時(shí)間,RocketMQ服務(wù)端的壓力會(huì)減輕
拉模式采用的DefaultMQPullConsumer來實(shí)現(xiàn)。
RocketMQ事務(wù)消息
RocketMQ的事務(wù)消息解決了,消息已發(fā)送出去,但是本地事務(wù)異?;貪L,無法進(jìn)行消息撤回的問題。
事務(wù)消息分為以下步驟
1.生產(chǎn)者向Broker發(fā)送半消息
2.所有半消息存儲(chǔ)在固定Topic:RMQ_SYS_TRANS_HALF_TOPIC中,對(duì)于消費(fèi)者不可見
3.服務(wù)端將消息持久化,并向生產(chǎn)者返回ACK確認(rèn)發(fā)送成功
4.生產(chǎn)者執(zhí)行本地事務(wù),根據(jù)事務(wù)結(jié)果向服務(wù)器進(jìn)行二次確認(rèn)(commit或者rollback)
5.如果服務(wù)端收到為提交,就將半消息拷貝到原始隊(duì)列中,等待消費(fèi)者消費(fèi)
6.如果服務(wù)端遲遲收不到二次確認(rèn),會(huì)返查生產(chǎn)者,查看消息的狀態(tài)

消息如何持久化
1.當(dāng)個(gè)Broker實(shí)例下,當(dāng)生產(chǎn)者發(fā)送的消息內(nèi)容,全部會(huì)寫到一個(gè)日志數(shù)據(jù)文件來存儲(chǔ)(commitlog)

2.當(dāng)消息到達(dá) commitlog 后,會(huì)采用異步轉(zhuǎn)發(fā)到消息隊(duì)列,也就是 consumerqueue,該文件夾下有三級(jí)目錄:
第一級(jí)目錄:topic命名的文件夾
第二級(jí)目錄:MessageQueue 隊(duì)列ID命名的文件夾
第三級(jí)目錄: 具體的consumerQueue文件(該文件記錄了,commitLog文件的位移offset,根據(jù)位移就能從commitLog找到具體的消息)

這樣分層之后, RocketMQ 至少可以得到以下幾個(gè)訊息:
2.1 先通過topic名稱,可以定位到具體的文件夾;
2.2 然后根據(jù)消息隊(duì)列ID找到具體的文件;
2.3 最后根據(jù)文件內(nèi)容,或得位移offset,然后根據(jù)定位commitLog消息內(nèi)容。