为什么使用消息中间件
為什么要使用消息中間件
如有一個(gè)電商交易的場(chǎng)景,用戶下單之后調(diào)用庫存系統(tǒng)減庫存,然后調(diào)用物流系統(tǒng)進(jìn)行發(fā)貨,如果剛開始交易,庫存,物流都是屬于一個(gè)系統(tǒng),那么他們之間就是接口調(diào)用。但是隨著系統(tǒng)的發(fā)展,各個(gè)模塊業(yè)務(wù)越來越龐大、業(yè)務(wù)邏輯越來越復(fù)雜,這個(gè)時(shí)候就必然要做服務(wù)化和業(yè)務(wù)拆分。這個(gè)時(shí)候就需要考慮這些系統(tǒng)之間是如何交互的。首先想到的就是RPC(Remote Procedure Call),但是隨著系統(tǒng)的發(fā)展,可能一筆交易后序需要調(diào)用幾十個(gè)接口位于不同系統(tǒng)的接口,比如短信服務(wù)、郵件服務(wù)等等,這個(gè)時(shí)候就需要消息中間件來解決問題了。
消息中間件最突出的特點(diǎn)就是提供數(shù)據(jù)傳輸?shù)目煽啃院透咝?#xff0c;主要解決分布式的系統(tǒng)數(shù)據(jù)傳輸需求
消息隊(duì)列的應(yīng)用場(chǎng)景
消息中間件主要解決分布式系統(tǒng)數(shù)據(jù)傳輸?shù)男枨?#xff0c;同時(shí)提供數(shù)據(jù)傳輸?shù)目煽啃院透咝浴?/p>
低耦合
低耦合:消息中間件在處理過程中插入了一個(gè)接口層,兩邊的處理過程都實(shí)現(xiàn)這接口,這允許你獨(dú)立的擴(kuò)展或是修改兩邊的處理過程,只要確保他們遵守同樣的接口約束。
應(yīng)用場(chǎng)景
用戶下單后,訂單系統(tǒng)需要通知庫存系統(tǒng)。通常的做法是訂單系統(tǒng)調(diào)用庫存系統(tǒng)的接口。
缺點(diǎn):1.加入庫存系統(tǒng)無法訪問,則訂單減庫存將失敗,從而導(dǎo)致訂單失敗。
2.庫存系統(tǒng)更改了減庫存的接口(例如修改了入?yún)?#xff09;,訂單系統(tǒng)需要進(jìn)行相應(yīng)的改變,訂單系統(tǒng)會(huì)被影響。
引入消息隊(duì)列之后:
訂單系統(tǒng),用戶下單之后,訂單系統(tǒng)完成持久化處理,并將消息寫入消息隊(duì)列,返回用戶訂單下單成功。
庫存系統(tǒng):訂閱下單的消息,獲取下單信息,進(jìn)行庫存操作。
如果在下單時(shí)庫存系統(tǒng)不能正常使用。也不影響下單,因?yàn)橄聠沃笥唵蜗到y(tǒng)寫入消息隊(duì)列之后不用關(guān)系其他操作,庫存系統(tǒng)系統(tǒng)恢復(fù)之后,獲取消息隊(duì)列中的消息,進(jìn)行減庫存的操作。并且單獨(dú)修改庫存系統(tǒng)并不會(huì)影響到訂單系統(tǒng)。
?異步通信
異步通信:在很多時(shí)候應(yīng)用不想也不需要立即處理消息。消息中間件提供了異步處理機(jī)制,允許應(yīng)用把一些消息放入消息中間中,但并不立即處理它,之后需要的時(shí)候再慢慢處理。
應(yīng)用場(chǎng)景
用戶注冊(cè)以后,需要發(fā)送注冊(cè)郵件和注冊(cè)短信,傳統(tǒng)的方式有兩種串行處理和并行處理。
串行處理:進(jìn)注冊(cè)信息寫入數(shù)據(jù)庫成功之后,發(fā)送注冊(cè)短信再發(fā)送注冊(cè)短信,三個(gè)任務(wù)完成之后返回客戶端。假設(shè)每個(gè)業(yè)務(wù)節(jié)點(diǎn)使用50毫秒,不考慮網(wǎng)絡(luò)等其他開銷,總共花費(fèi)150ms時(shí)間
并行處理:將注冊(cè)信息寫入數(shù)據(jù)庫成功之后,發(fā)送注冊(cè)短信的同時(shí)發(fā)送注冊(cè)郵件,三個(gè)任務(wù)完成之后返回給客戶端。假設(shè)每個(gè)業(yè)務(wù)節(jié)點(diǎn)使用50ms,不考慮網(wǎng)絡(luò)等開銷,并行的時(shí)間為100ms。
雖然并行處理可以提高效率,但是由于發(fā)送短信和發(fā)送郵件對(duì)于我們正常使用應(yīng)用來說是沒有影響的,所以客戶端不需要當(dāng)它發(fā)送短信和郵件完成之后才提示用戶注冊(cè)成功,當(dāng)成功寫入數(shù)據(jù)庫時(shí),就可以返回了。
?引入消息隊(duì)列之后:將不是必須的業(yè)務(wù)邏輯(發(fā)送注冊(cè)短信和注冊(cè)郵件),進(jìn)行異步處理。用戶的響應(yīng)時(shí)間=寫入數(shù)據(jù)庫時(shí)間+寫入消息隊(duì)列時(shí)間(可以忽略不計(jì))
?緩沖能力和流量削峰
緩沖能力和流量削峰:消息中間件通過一個(gè)緩沖層來幫助任務(wù)最高效率地執(zhí)行,寫入消息中間件的處理會(huì)盡可能快速。該緩沖層有助于控制和優(yōu)化數(shù)據(jù)流過系統(tǒng)的速度。使用消息中間件能夠使關(guān)鍵組件支撐突發(fā)訪問壓力,不會(huì)因?yàn)橥话l(fā)的超負(fù)荷請(qǐng)求而完全崩潰。
應(yīng)用場(chǎng)景:
流量削峰一般在秒殺活動(dòng)或團(tuán)搶購(gòu)活動(dòng)中使用廣泛,在秒殺活動(dòng)中,一般會(huì)因?yàn)榱髁勘┰?#xff0c;導(dǎo)致應(yīng)用掛掉。為了解決這個(gè)問題一般在應(yīng)用前端加入消息隊(duì)列,可以控制活動(dòng)的人數(shù),可以緩解短時(shí)間內(nèi)高流量。
傳統(tǒng)模式:在下單的時(shí)候就往數(shù)據(jù)庫中寫入數(shù)據(jù),但是如果并發(fā)量過高,可能就會(huì)宕機(jī)。
引入消息隊(duì)列之后:
消息被寫入消息隊(duì)列之后,系統(tǒng)可以根據(jù)自己的消費(fèi)能力來消費(fèi),比如每秒2000個(gè)數(shù)據(jù)寫入數(shù)據(jù)庫。
如果加入消息隊(duì)列長(zhǎng)度超過最大數(shù)量,則可以直接拋棄用戶請(qǐng)求或挑戰(zhàn)到錯(cuò)誤頁面。
參考博文:消息中間件概述https://zengyihong.blog.csdn.net/article/details/127019856什么是消息中間件https://blog.csdn.net/weixin_43561060/article/details/118195543
總結(jié)
以上是生活随笔為你收集整理的为什么使用消息中间件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++开发中大小驼峰命名规则
- 下一篇: webpack-js压缩