vs2019可以做網(wǎng)站嗎北京seo網(wǎng)站推廣
為什么使用 MQ?
-
流量削峰和緩沖
如果訂單系統(tǒng)最多能處理一萬(wàn)次訂單,這個(gè)處理能力在足夠應(yīng)付正常時(shí)段的下單,但是在高峰期,可能會(huì)有兩萬(wàn)次下單操作,訂單系統(tǒng)只能處理一萬(wàn)次下單操作,剩下的一萬(wàn)次被阻塞。我們可以使用消息隊(duì)列做緩沖,取消這個(gè)限制,把一秒內(nèi)下的訂單分散成一段時(shí)間來(lái)處理,減少了系統(tǒng)的壓力,增強(qiáng)了用戶的體驗(yàn)效果。 -
應(yīng)用解耦
不同的應(yīng)用程序可以通過(guò)消息隊(duì)列的方式解耦,生產(chǎn)者和消費(fèi)者之間不需要直接相互通信,而是通過(guò)共享的消息隊(duì)列進(jìn)行通信。應(yīng)用解耦使系統(tǒng)更靈活。 -
異步處理
在秒殺任務(wù)中,大量用戶下單時(shí),將訂單信息和庫(kù)存信息保存在緩存中,之后使用消息隊(duì)列的更改數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
幾種MQ的對(duì)比:
RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
---|---|---|---|---|
公司/社區(qū) | Rabbit | Apache | 阿里 | Apache |
開(kāi)發(fā)語(yǔ)言 | Erlang | Java | Java | Scala&Java |
協(xié)議支持 | AMQP,XMPP,SMTP,STOMP | OpenWire,STOMP,REST,XMPP,AMQP | 自定義協(xié)議 | 自定義協(xié)議 |
可用性 | 高 | 一般 | 高 | 高 |
單機(jī)吞吐量 | 一般 | 差 | 高 | 非常高 |
消息延遲 | 微秒級(jí) | 毫秒級(jí) | 毫秒級(jí) | 毫秒以內(nèi) |
消息可靠性 | 高 | 一般 | 高 | 一般 |
追求可用性:Kafka、 RocketMQ 、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能力:RocketMQ、Kafka
追求消息低延遲:RabbitMQ、Kafka
RabbitMQ
四個(gè)概念:
- Publisher:生產(chǎn)者,也就是要發(fā)送消息的程序,但是不再發(fā)送到隊(duì)列中,而是發(fā)給交換機(jī)
- Exchange:交換機(jī)。一方面,接收生產(chǎn)者發(fā)送的消息。另一方面,知道如何處理消息,例如遞交給某個(gè)特別隊(duì)列、遞交給所有隊(duì)列、或是將消息丟棄。到底如何操作,取決于Exchange的類(lèi)型。Exchange有以下3種類(lèi)型:
- Fanout:廣播,將消息交給所有綁定到交換機(jī)的隊(duì)列
- Direct:定向,把消息交給符合指定routing key 的隊(duì)列
- Topic:通配符,把消息交給符合routing pattern(路由模式) 的隊(duì)列
- Consumer:消費(fèi)者,與以前一樣,訂閱隊(duì)列,沒(méi)有變化
- Queue:消息隊(duì)列也與以前一樣,接收消息、緩存消息。
Exchange(交換機(jī))只負(fù)責(zé)轉(zhuǎn)發(fā)消息,不具備存儲(chǔ)消息的能力,因此如果沒(méi)有任何隊(duì)列與Exchange綁定,或者沒(méi)有符合路由規(guī)則的隊(duì)列,那么消息會(huì)丟失!
工作原理
- Broker:
接收和分發(fā)消息的應(yīng)用,RabbitMQ Server 就是 Message Broker - Virtual host
出于多租戶和安全因素設(shè)計(jì)的,把 AMQP 的基本組件劃分到一個(gè)虛擬的分組中,類(lèi)似 于網(wǎng)絡(luò)中的 namespace 概念。當(dāng)多個(gè)不同的用戶使用同一個(gè) RabbitMQ server 提供的服務(wù)時(shí),可以劃分出 多個(gè) vhost,每個(gè)用戶在自己的 vhost 創(chuàng)建 exchange/queue 等,實(shí)現(xiàn)不同服務(wù)之間的隔離。 - Connection
publisher/consumer 和 broker 之間的 TCP 連接。 - Channel
如果每一次訪問(wèn) RabbitMQ 都建立一個(gè) Connection,在消息量大的時(shí)候建立 TCP Connection 的開(kāi)銷(xiāo)將是巨大的,效率也較低。Channel 是在 connection 內(nèi)部建立的邏輯連接,如果應(yīng)用程 序支持多線程,通常每個(gè) thread 創(chuàng)建單獨(dú)的 channel 進(jìn)行通訊,AMQP method 包含了 channel id 幫助客 戶端和 message broker 識(shí)別 channel,所以 channel 之間是完全隔離的。Channel 作為輕量級(jí)的 Connection 極大減少了操作系統(tǒng)建立 TCP connection 的開(kāi)銷(xiāo)。