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