MQ是互聯(lián)網(wǎng)業(yè)務(wù)比較常見的解耦利器谴垫,一下簡單介紹下RabbitMQ的一些使用嫩实。
解耦
典型的一個(gè)場景就是訂單系統(tǒng)和財(cái)務(wù)結(jié)算系統(tǒng)堕汞。訂單系統(tǒng)生成訂單之后只需要發(fā)一個(gè)MQ通知到財(cái)務(wù)系統(tǒng)進(jìn)行相應(yīng)的金額賬戶扣減即可罪帖。這里因?yàn)橛脩舨恍枰却?cái)務(wù)系統(tǒng)的操作所以很適合使用MQ的解耦提高用戶體驗(yàn)躁劣。系統(tǒng)間保持最終一致性即可
削峰填谷
簡單來說就是控制平衡多個(gè)系統(tǒng)之間的流量迫吐。可以使用MQ的拉取模式來控制消費(fèi)端的消費(fèi)速度账忘。與傳統(tǒng)的消費(fèi)端監(jiān)聽模式不同的是拉取模式不需要再配置文件里面配置listener了志膀,如下代碼指定即可:
messageConsumer.start();
for (int i=0;i<100;i++){
//手動拉取消息
messageConsumer.pull(topic,messageListener);
}
每調(diào)用一次拉取一次,可以開啟多線程并行消費(fèi)鳖擒。監(jiān)聽模式是有消費(fèi)端的守護(hù)線程不停地拉取消息消費(fèi)的溉浙,更適合要求響應(yīng)快的讀取的場景。拉取模式適合最終能落地可控流量的寫場景蒋荚。
重試補(bǔ)償
由于在系統(tǒng)之間使用MQ通訊會出現(xiàn)各種網(wǎng)絡(luò)異常戳稽,例如消費(fèi)端消費(fèi)成功但是因?yàn)樯a(chǎn)端異常回滾通過定時(shí)任務(wù)重新發(fā)起MQ期升,這時(shí)如果消費(fèi)端沒有實(shí)現(xiàn)消費(fèi)的冪等性就會造成數(shù)據(jù)的不一致惊奇。其中一個(gè)解決方案是,生產(chǎn)端發(fā)送MQ時(shí)帶上請求的流水號并妥善保存播赁,每一條業(yè)務(wù)實(shí)例如訂單重試的時(shí)候需要帶上相同的流水號赊时,這樣消費(fèi)端消費(fèi)時(shí)根據(jù)流水號檢測到已經(jīng)處理過就不會錯(cuò)誤地重復(fù)處理了從而能保證消費(fèi)的冪等性與數(shù)據(jù)一致性。發(fā)送端只需要把生成訂單和發(fā)送MQ這個(gè)操作放到一個(gè)本地事務(wù)即可保證最終的一致性行拢。
總結(jié)
我簡單介紹了下MQ的一些使用經(jīng)驗(yàn)和場景祖秒。重點(diǎn)列舉了重試補(bǔ)償機(jī)制和數(shù)據(jù)一致性的實(shí)踐,希望以后的學(xué)習(xí)工作中能更加合理地使用舟奠。