RocketMQ使用場(chǎng)景
場(chǎng)景介紹
針對(duì)一家互聯(lián)網(wǎng)電商企業(yè),其業(yè)務(wù)涉及廣泛,如注冊(cè)、訂單、庫(kù)存、物流等;同時(shí),也會(huì)涉及許多業(yè)務(wù)峰值時(shí)刻,如秒殺活動(dòng)、周年慶、定期特惠等,這些活動(dòng)都對(duì)分布性系統(tǒng)中的各項(xiàng)微服務(wù)應(yīng)用的處理性能帶來(lái)很大的進(jìn)步。
重要功能
- 異步解耦
- 分布式事務(wù)的數(shù)據(jù)一致性
- 消息的順序收發(fā)
- 削峰填谷
- 大規(guī)模機(jī)器的緩存同步
實(shí)例
用戶注冊(cè)
傳統(tǒng)處理
最常見的一個(gè)場(chǎng)景是用戶注冊(cè)后,需要發(fā)送注冊(cè)郵件和短信通知,以告知用戶注冊(cè)成功。
兩種處理方式如下:
- 串行方式
串行方式下的注冊(cè)流程如下圖所示。
數(shù)據(jù)流動(dòng)如下

- 總結(jié)
以上所有的任務(wù)完成后,才返回注冊(cè)結(jié)果到客戶端,用戶才能使用賬號(hào)登錄,假設(shè)每個(gè)任務(wù)耗時(shí)50ms,則用戶需要等待150ms才能登錄
-
并行方式
image
數(shù)據(jù)流動(dòng)如下
- 總結(jié)
假設(shè)每個(gè)任務(wù)耗時(shí)分別為 50 ms,其中,郵件和短信通知并行完成,則用戶需要在注冊(cè)頁(yè)面等待總共需要 100 ms 才能登錄。
異步解耦
對(duì)于用戶來(lái)說(shuō),注冊(cè)功能實(shí)際只需要注冊(cè)系統(tǒng)存儲(chǔ)用戶的賬戶信息后,該用戶便可以登錄,后續(xù)的注冊(cè)短信和郵件不是即時(shí)需要關(guān)注的步驟。
對(duì)于注冊(cè)系統(tǒng)而言,發(fā)送注冊(cè)成功的短信和郵件通知兵役要綁定在一起同步完成,所以實(shí)際當(dāng)數(shù)據(jù)寫入注冊(cè)系統(tǒng)后,注冊(cè)系統(tǒng)就可以把其他的操作放入對(duì)應(yīng)的消息隊(duì)列RocketMQ中然后馬上返回用戶結(jié)果,由消息隊(duì)列RocketMQ異步進(jìn)行操作。
- 數(shù)據(jù)流動(dòng)如下

- 總結(jié)
用戶只需在注冊(cè)頁(yè)面等待注冊(cè)數(shù)據(jù)寫入注冊(cè)系統(tǒng)和消息隊(duì)列 RocketMQ 的時(shí)間,即等待 55 ms 即可登錄。
異步解耦是消息隊(duì)列 RocketMQ 的主要特點(diǎn),主要目的是減少請(qǐng)求響應(yīng)時(shí)間和解耦。主要的使用場(chǎng)景就是將比較耗時(shí)而且不需要即時(shí)(同步)返回結(jié)果的操作作為消息放入消息隊(duì)列。同時(shí),由于使用了消息隊(duì)列 RocketMQ,只要保證消息格式不變,消息的發(fā)送方和接收方并不需要彼此聯(lián)系,也不需要受對(duì)方的影響,即解耦和。
分布式事務(wù)的數(shù)據(jù)一致性
注冊(cè)系統(tǒng)注冊(cè)的流程中,用戶入口在網(wǎng)頁(yè)注冊(cè)系統(tǒng),通知系統(tǒng)在郵件系統(tǒng),兩個(gè)系統(tǒng)之間的數(shù)據(jù)需要保持最終一致性。
普通消息處理
如上述所述,注冊(cè)系統(tǒng)和郵件通知系統(tǒng)之間通過消息隊(duì)列進(jìn)行異步處理。注冊(cè)系統(tǒng)將注冊(cè)信息寫入注冊(cè)系統(tǒng)之后,發(fā)送一條注冊(cè)成功的消息到消息隊(duì)列RocketMQ,郵件通知系統(tǒng)訂閱消息隊(duì)列RocketMQ的注冊(cè)消息,做相應(yīng)的業(yè)務(wù)處理,發(fā)送注冊(cè)成功或者失敗的郵件,具體流程如下圖所示:
流程說(shuō)明如下:
- 注冊(cè)系統(tǒng)發(fā)起注冊(cè)。
- 注冊(cè)系統(tǒng)向消息隊(duì)列 RocketMQ 發(fā)送注冊(cè)消息成功與否的消息。
2.1 消息發(fā)送成功,進(jìn)入 3。
2.2 消息發(fā)送失敗,導(dǎo)致郵件通知系統(tǒng)未收到消息隊(duì)列 RocketMQ 發(fā)送的注冊(cè)成功與否的消息,而無(wú)法發(fā)送郵件,最終郵件通知系統(tǒng)和注冊(cè)系統(tǒng)之間的狀態(tài)數(shù)據(jù)不一致。 - 郵件通知系統(tǒng)收到消息隊(duì)列 RocketMQ 的注冊(cè)成功消息。
- 郵件通知系統(tǒng)發(fā)送注冊(cè)成功郵件給用戶。
在這樣的情況下,雖然實(shí)現(xiàn)了系統(tǒng)間的解藕,上游系統(tǒng)不需要關(guān)心下游系統(tǒng)的業(yè)務(wù)處理結(jié)果;但是數(shù)據(jù)一致性不好處理,如何保證郵件通知系統(tǒng)狀態(tài)與注冊(cè)系統(tǒng)狀態(tài)的最終一致
事務(wù)消息處理
此時(shí),需要有利用消息隊(duì)列 RocketMQ 所提供的事務(wù)消息來(lái)實(shí)現(xiàn)系統(tǒng)間的狀態(tài)數(shù)據(jù)一致性。具體流程如下圖所示。
流程說(shuō)明如下:
- 注冊(cè)系統(tǒng)向消息隊(duì)列 RocketMQ 發(fā)送半事務(wù)消息。
1.1 半事務(wù)消息發(fā)送成功,進(jìn)入 2。
1.2 半事務(wù)消息發(fā)送失敗,注冊(cè)系統(tǒng)不進(jìn)行注冊(cè),流程結(jié)束。(最終注冊(cè)系統(tǒng)與郵件通知系統(tǒng)數(shù)據(jù)一致 - 注冊(cè)系統(tǒng)開始注冊(cè)。
2.1 注冊(cè)成功,進(jìn)入 3.1。
2.2 注冊(cè)失敗,進(jìn)行 3.2。 - 注冊(cè)系統(tǒng)向消息隊(duì)列 RocketMQ 發(fā)送半消息狀態(tài)。
3.1 提交半事務(wù)消息,產(chǎn)生注冊(cè)成功消息,進(jìn)入 4。
3.2 回滾半事務(wù)消息,未產(chǎn)生注冊(cè)成功消息,流程結(jié)束。(最終注冊(cè)系統(tǒng)與郵件通知系統(tǒng)數(shù)據(jù)一致) - 郵件通知系統(tǒng)接收消息隊(duì)列 RocketMQ 的注冊(cè)成功消息。
- 郵件通知系統(tǒng)發(fā)送注冊(cè)成功郵件。(最終注冊(cè)系統(tǒng)與郵件通知系統(tǒng)數(shù)據(jù)一致)
消息的順序收發(fā)
消息隊(duì)列 RocketMQ 順序消息分為兩種情況:
- 全局順序:對(duì)于指定的一個(gè) Topic,所有消息將按照嚴(yán)格的先入先出(FIFO)的順序,進(jìn)行順序發(fā)布和順序消費(fèi);
- 分區(qū)順序:對(duì)于指定的一個(gè) Topic,所有消息根據(jù) Sharding Key 進(jìn)行區(qū)塊分區(qū),同一個(gè)分區(qū)內(nèi)的消息將按照嚴(yán)格的 FIFO 的順序,進(jìn)行順發(fā)布和順序消費(fèi),可以保證一個(gè)消息被一個(gè)進(jìn)程消費(fèi)。
在注冊(cè)場(chǎng)景中,可使用用戶 ID 作為 Sharding Key 來(lái)進(jìn)行分區(qū),同一個(gè)分區(qū)下的新建、更新或刪除注冊(cè)信息的消息必須按照 FIFO 的順序發(fā)布和消費(fèi)。
削峰填谷
流量削鋒也是消息隊(duì)列 RocketMQ 的常用場(chǎng)景,一般在秒殺或團(tuán)隊(duì)搶購(gòu)活動(dòng)中使用廣泛。
在秒殺或團(tuán)隊(duì)搶購(gòu)活動(dòng)中,由于用戶請(qǐng)求量較大,導(dǎo)致流量暴增,秒殺的應(yīng)用在處理如此大量的訪問流量后,下游的通知系統(tǒng)無(wú)法承載海量的調(diào)用量,甚至?xí)?dǎo)致系統(tǒng)崩潰等問題而發(fā)生漏通知的情況。為解決這些問題,可在應(yīng)用和下游通知系統(tǒng)之間加入消息隊(duì)列 RocketMQ,如下圖所示。
秒殺處理流程如下所述:
- 用戶發(fā)起海量秒殺請(qǐng)求到秒殺業(yè)務(wù)處理系統(tǒng)。
- 秒殺處理系統(tǒng)按照秒殺處理邏輯將滿足秒殺條件的請(qǐng)求發(fā)送至消息隊(duì)列 RocketMQ。
- 下游的通知系統(tǒng)訂閱消息隊(duì)列 RocketMQ 的秒殺相關(guān)消息,再將秒殺成功的消息發(fā)送到相應(yīng)用戶。
- 用戶收到秒殺成功的通知。
大規(guī)模機(jī)器的緩存同步
雙十一大促時(shí),各個(gè)分會(huì)場(chǎng)會(huì)有玲瑯滿目的商品,每件商品的價(jià)格都會(huì)實(shí)時(shí)變化。使用緩存技術(shù)也無(wú)法滿足對(duì)商品價(jià)格的訪問需求,緩存服務(wù)器網(wǎng)卡滿載。訪問較多次商品價(jià)格查詢影響會(huì)場(chǎng)頁(yè)面的打開速度。
此時(shí)需要提供一種廣播機(jī)制,一條消息本來(lái)只可以被集群的一臺(tái)機(jī)器消費(fèi),如果使用消息隊(duì)列 RocketMQ 的廣播消費(fèi)模式,那么這條消息會(huì)被所有節(jié)點(diǎn)消費(fèi)一次,相當(dāng)于把價(jià)格信息同步到需要的每臺(tái)機(jī)器上,取代緩存的作用。