摘要:概述概述消息隊(duì)列,是分布式系統(tǒng)中重要的組件,是一種進(jìn)程間通信或者是同一進(jìn)程的不同線程的通信方式。消息隊(duì)列的使用場景消息隊(duì)列的使用場景異步處理流量控制應(yīng)用解耦應(yīng)用解耦應(yīng)用解耦消息隊(duì)列的一個(gè)作用就是實(shí)現(xiàn)系統(tǒng)應(yīng)用之間的解耦。
消息隊(duì)列(Message Queue),是分布式系統(tǒng)中重要的組件,是一種進(jìn)程間通信或者是同一進(jìn)程的不同線程的通信方式。和 http 同步協(xié)議不同的是,消息隊(duì)列是一種異步的通信協(xié)議,不需要立即獲得結(jié)果。
消息隊(duì)列的一個(gè)作用就是實(shí)現(xiàn)系統(tǒng)應(yīng)用之間的解耦。舉例一下電商系統(tǒng)的中的訂單系統(tǒng)。
當(dāng)創(chuàng)建一個(gè)訂單時(shí):
這些訂單下游的系統(tǒng)都需要實(shí)時(shí)獲得訂單數(shù)據(jù),隨著業(yè)務(wù)量的增大和業(yè)務(wù)的變更,有一段時(shí)間不需要發(fā)消息給客戶,或者需要添加功能,每次都需要不斷的調(diào)式訂單系統(tǒng)和下游系統(tǒng)。
引入消息隊(duì)列后,訂單服務(wù)在創(chuàng)建訂單時(shí)發(fā)送一條信息到消息隊(duì)列主題 Order 中,所有的下游都訂閱主題Order,這樣無論增加、減少下游系統(tǒng)還是下游系統(tǒng)的功能如何變化,訂單服務(wù)都不需要做更改了,實(shí)現(xiàn)了訂單服務(wù)和下游服務(wù)的解耦。
異步處理是將很多串行進(jìn)行的步驟轉(zhuǎn)成異步處理,還是已訂單系統(tǒng)為例,下單訂單需要?jiǎng)?chuàng)建訂單和鎖定庫存,確定本次請(qǐng)求后馬上給用戶返回響應(yīng),然后把后續(xù)請(qǐng)求的數(shù)據(jù)的都在消息隊(duì)列,由消息隊(duì)列異步處理。
這樣把五個(gè)步驟減少為兩個(gè)步驟,假設(shè)每個(gè)步驟處理時(shí)間需要500ms,在不考慮網(wǎng)絡(luò)延遲的情況下:
串行處理: 500 * 5 = 2500ms
并行處理:500 * 2 = 1000ms
系統(tǒng)響應(yīng)時(shí)間縮短一半以上。這樣響應(yīng)速度更快,而且把請(qǐng)求放在后續(xù)操作,可以充分利用更多的資源處理請(qǐng)求。
所以我們可以看到,實(shí)現(xiàn)異步操作的服務(wù):
在購物網(wǎng)站的做一個(gè)秒殺活動(dòng),平時(shí)網(wǎng)站能支撐每秒1000次并發(fā)請(qǐng)求,但是電商秒殺一下請(qǐng)求猛增到每秒3000次請(qǐng)求,多出來的請(qǐng)求,可能直接讓系統(tǒng)宕機(jī)。
所以我們就需要使用消息隊(duì)列來控制流量,當(dāng)系統(tǒng)短時(shí)間接收到大量請(qǐng)求時(shí),會(huì)先將請(qǐng)求堆積到消息隊(duì)列上,后端服務(wù)從消息隊(duì)列上消費(fèi)數(shù)據(jù),消息隊(duì)列相對(duì)于給后端服務(wù)做了一次緩沖。
上面的概述總結(jié)起來有個(gè)三個(gè)優(yōu)點(diǎn):異步、削峰和解耦。
缺點(diǎn)有以下幾個(gè):
在rabbitmq官網(wǎng)教程上介紹了幾種工作模式,
The simplest thing that does something
從上面的示意圖看出來 simple 模式有以下幾個(gè)特征:
在多個(gè)消費(fèi)者之間分配任務(wù)(競爭消費(fèi)者模式)
創(chuàng)建一個(gè)工作隊(duì)列,添加多個(gè)消費(fèi)者共同消費(fèi)工作隊(duì)列上的任務(wù)。每一個(gè)消息都給一個(gè)消費(fèi)者消費(fèi)
工作模式中每個(gè)消息只能被一個(gè)消費(fèi)者消費(fèi),發(fā)布訂閱模式是每個(gè)消息同時(shí)給多個(gè)消費(fèi)者消費(fèi)。
上圖中的X
表示Exchange
交換器,Exchange
類型有:Direct、Topic、Headers和Fanout。
路由模式中的交換器類型為 direct,在同一個(gè)交換器,由生產(chǎn)者指定指定目標(biāo)隊(duì)列。
RoutingKey 是生產(chǎn)者指定 Exchange 路由到哪個(gè)隊(duì)列,BindingKey 用于消費(fèi)者綁定到某個(gè)隊(duì)列
主題模式是根據(jù)通配符綁定隊(duì)列,其中 * 可以替換任務(wù)一個(gè)標(biāo)識(shí)符,# 可以替換多個(gè)標(biāo)識(shí)符,通配符和名稱使用 . 隔開。
如果覺得文章對(duì)你有幫助的話,請(qǐng)點(diǎn)個(gè)推薦吧!!!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/123763.html
摘要:以下為大家整理了阿里巴巴史上最全的面試題,涉及大量面試知識(shí)點(diǎn)和相關(guān)試題。的內(nèi)存結(jié)構(gòu),和比例。多線程多線程的幾種實(shí)現(xiàn)方式,什么是線程安全。點(diǎn)擊這里有一套答案版的多線程試題。線上系統(tǒng)突然變得異常緩慢,你如何查找問題。 以下為大家整理了阿里巴巴史上最全的 Java 面試題,涉及大量 Java 面試知識(shí)點(diǎn)和相關(guān)試題。 JAVA基礎(chǔ) JAVA中的幾種基本數(shù)據(jù)類型是什么,各自占用多少字節(jié)。 S...
摘要:這里有一份面試題相關(guān)總結(jié),涉及高并發(fā)分布式高可用相關(guān)知識(shí)點(diǎn),在此分享給大家,希望大家能拿到一份理想的知識(shí)點(diǎn)會(huì)陸續(xù)更新在上,覺得還算湊和的話可以關(guān)注一下噢高并發(fā)架構(gòu)消息隊(duì)列為什么使用消息隊(duì)列消息隊(duì)列有什么優(yōu)點(diǎn)和缺點(diǎn)都有什么優(yōu)點(diǎn)和缺點(diǎn)如何保證消 這里有一份面試題相關(guān)總結(jié),涉及高并發(fā)、分布式、高可用相關(guān)知識(shí)點(diǎn),在此分享給大家,希望大家能拿到一份理想的 Offer! 知識(shí)點(diǎn)會(huì)陸續(xù)更新在 Git...
摘要:只允許有一個(gè)主進(jìn)程接受客戶事務(wù)請(qǐng)求并處理,收到請(qǐng)求后,將其轉(zhuǎn)化為事務(wù)。并開啟新一輪選舉,新的會(huì)和過半的進(jìn)行同步數(shù)據(jù)。同步結(jié)束時(shí),切換為消息廣播模式。若非節(jié)點(diǎn)收到客戶請(qǐng)求,則該節(jié)點(diǎn)會(huì)將該請(qǐng)求發(fā)送到服務(wù)器上。 zookeeper 它為分布式應(yīng)用提供了高效可靠的分布式協(xié)調(diào)服務(wù)。 實(shí)現(xiàn)依賴于 ZAB協(xié)議,實(shí)現(xiàn)了主備模式架構(gòu)用來保持集群中數(shù)據(jù)的一致性 Zookeeper 將所有數(shù)據(jù)存放在 內(nèi)存...
閱讀 3639·2023-04-26 02:24
閱讀 972·2023-04-25 14:47
閱讀 2571·2021-11-24 11:16
閱讀 1762·2021-11-24 09:38
閱讀 1608·2021-11-18 10:07
閱讀 2097·2021-09-22 15:49
閱讀 1622·2019-08-30 15:55
閱讀 916·2019-08-26 13:38