一篇小文带你走进RabbitMQ的世界
云棲號資訊:【點(diǎn)擊查看更多行業(yè)資訊】
在這里您可以找到不同行業(yè)的第一手的上云資訊,還在等什么,快來!
說到消息中間件,大部分人的第一印象可能是Kafka。畢竟Kafka自問世以來,就頂著高并發(fā),大流量的光環(huán)。當(dāng)然了Kafka也不負(fù)眾望,在大數(shù)據(jù)處理方面一直獨(dú)領(lǐng)風(fēng)騷。
這里想說說另一款同樣優(yōu)秀的消息中間件RabbitMQ。
選RabbitMQ還是Kafka
如果單機(jī)數(shù)據(jù)量沒有到十萬級以上,我覺得選哪個都OK,如果超過百萬甚至到了千萬級那么建議選擇Kafka。
對了還有重要的一點(diǎn),RabbitMQ支持事務(wù),而Kafka不支持。所以如果你的業(yè)務(wù)系統(tǒng)要求支持事務(wù),那么只能選RabbitMQ。這也是很多金融系統(tǒng)選擇RabbitMQ作為消息中間件的原因。
RabbitMQ基本概念
先來說一下消息中間件的通用模型,所有的消息中間件的模型基本都是這樣。
?
而RabbitMQ是基于AMQP協(xié)議實(shí)現(xiàn)的。模型大概是這個樣子,如下圖所示
?
重點(diǎn)關(guān)注中間兩個框框,下面依次解讀一下。
信道
建立TCP鏈接是一件很費(fèi)時的事情,所以很多提供高并發(fā)服務(wù)的軟件都支持TCP鏈接復(fù)用,比如HTTP協(xié)議的KeepAlive就是為了復(fù)用TCP鏈接準(zhǔn)備的。所以RabbitMQ提出了信道的概念,一個TCP鏈接里面可以支持多個信道同時通信,以提高通信效率。如下圖所示。
?
broker
一個啟動的RabbitMQ實(shí)例,代表一個broker。
虛擬主機(jī)
虛擬主機(jī)可以理解成命名空間的概念,方便隊列管理。
交換器
向RabbitMQ發(fā)送消息時,先把消息先發(fā)到交換器,再由交換器根據(jù)相關(guān)路由規(guī)則發(fā)到特定隊列上。目前 RabbitMQ的交換器共四種類型:direct、fanout、topic、headers。
headers交換器:?匹配消息的header而不是路由鍵,除此之外headers交換器和direct交換器完全一致,但性能差很多,所以目前幾乎不用。
direct交換器:?消息中的路由鍵(routing key)如果和Binding(綁定的概念后面會介紹)中的 binding key 一致, 交換器就將消息發(fā)到對應(yīng)的隊列中。direct模式是完全匹配的單播模式,也就是說路由鍵與隊列名完全匹配,如果一個隊列綁定到交換機(jī)要求路由鍵為“dog”,則只轉(zhuǎn)發(fā) routing key 標(biāo)記為“dog”的消息,不會轉(zhuǎn)發(fā)“dog.puppy”的消息。如下圖所示。
?
fanout交換器:每個發(fā)送到fanout交換器中的消息,不會去匹配路由鍵,而是直接把消息投遞到所有綁定到fanout交換器上的隊列中。類似一個廣播站,會向所有收聽廣播的用戶發(fā)送消息。對應(yīng)到實(shí)際應(yīng)用中,它允許你針對一個消息作不同操作,比如用戶上傳了一張新的圖片,系統(tǒng)要同時對這個事件進(jìn)行不同的操作,比如刪除舊的圖片緩存、增加積分獎勵等等。這樣就大大降低了系統(tǒng)之間的耦合度了。
如下圖所示。
?
topic交換器:topic交換器和direct交換器有相似之處,它通過模式匹配的方式分發(fā)消息,將路由鍵和某個模式進(jìn)行匹配,此時隊列需要綁定到一個模式上。它將路由鍵和綁定鍵的字符串切分成單詞,這些單詞之間用點(diǎn)隔開。它同樣也會識別兩個通配符:符號#和符號。#匹配0個或多個單詞,匹配至少一個單詞。如下圖所示。
?
綁定
將消息隊列和交換器進(jìn)行關(guān)聯(lián)。一個綁定就是基于路由鍵將交換器和消息隊列連接起來的路由規(guī)則,所以可以將交換器理解成一個由綁定構(gòu)成的路由表,如下圖所示:
?
集群及高可用
因?yàn)镽abbitMQ是Erlang開發(fā)的,所以天生支持分布式。所謂的天生支持的意思就是不用像Kafka那樣借助ZK來實(shí)現(xiàn)集群。
先來看一下典型的RabbitMQ集群架構(gòu)圖。
?
集群分為普通模式和鏡像模式。另外RabbitMQ集群分為內(nèi)存節(jié)點(diǎn)和磁盤節(jié)點(diǎn),集群當(dāng)中必須存在磁盤節(jié)點(diǎn)。內(nèi)存節(jié)點(diǎn)就是將數(shù)據(jù)存儲到內(nèi)存中,讀寫效率會比較高;而磁盤節(jié)點(diǎn)是將數(shù)據(jù)存儲到磁盤上面,可以持久化保存數(shù)據(jù)。
普通模式:默認(rèn)的集群模式。所謂的普通模式就是,多臺機(jī)器上啟動多個Rabbitmq實(shí)例,每臺機(jī)器啟動一個實(shí)例。但是創(chuàng)建的queue,只會放在一個Rabbtimq實(shí)例上,每個實(shí)例都會同步queue的元數(shù)據(jù)。消費(fèi)的時候,如果連接到了另外一個實(shí)例,那么那個實(shí)例會從queue所在實(shí)例上拉取數(shù)據(jù)過來。如果存放queue的節(jié)點(diǎn)掛掉,那么就不能提供服務(wù)了。所以這種方式并不是真正的高可用。
鏡像模式:創(chuàng)建的queue,無論元數(shù)據(jù)還是消息都會存在于多個實(shí)例上,每次寫消息到queue的時候,都會自動把消息同步到多個實(shí)例的queue里。任何一個節(jié)點(diǎn)掛掉后,其他節(jié)點(diǎn)可以繼續(xù)提供服務(wù)。類似于Redis集群的哨兵模式。關(guān)于Redis的高可用部署方式,可以看我這篇文章。
元數(shù)據(jù):
元數(shù)據(jù)主要包含四類,分別是
- 隊列元數(shù)據(jù):隊列名稱及屬性;
- 交換器元數(shù)據(jù):交換器名稱、類型及屬性
- 綁定元數(shù)據(jù):記錄了如何將消息路由到隊列的數(shù)據(jù);
- vhost元數(shù)據(jù):為隊列、交換器和綁定提供命名空間和安全屬性的數(shù)據(jù);
運(yùn)維常用管理命令
啟動
/sbin/rabbitmq-server
重啟
/sbin/rabbitmqctl reset
停止
/sbin/rabbitmqctl stop
停止應(yīng)用
/sbin//rabbitmqctl stop_app
查看RabbitMQ狀態(tài)
/sbin/rabbitmqctl status
查看綁定
/sbin/rabbitmqctl list_bindings
查看交換器
/sbin/rabbitmqctl list_exchanges
查看已聲明的隊列
/sbin/rabbitmqctl list_queues
stop和stop_app 的區(qū)別
這里需要特別注意一下這兩個命令的區(qū)別:由于 RabbitmMQ是用Erlang寫的,Erlang有節(jié)點(diǎn)的概念,也就是在一個Erlang節(jié)點(diǎn)上,可以運(yùn)行很多個Erlang應(yīng)用,stop命令是使得整個Erlang節(jié)點(diǎn)停止工作,而stop_app則是使得當(dāng)前應(yīng)用停止工作,不會影響其它應(yīng)用的正常運(yùn)行。
總結(jié)
如果之前一直接觸的Java開發(fā)的中間件,突然接觸RabbitMQ,會有些許不適應(yīng)。特別是對于RabbitMQ的集群部署及高可用的理解。不過了解之后會發(fā)現(xiàn)這只兔子還是很可愛的。畢竟存在就有存在的道理。
【云棲號在線課堂】每天都有產(chǎn)品技術(shù)專家分享!
課程地址:https://yqh.aliyun.com/live
立即加入社群,與專家面對面,及時了解課程最新動態(tài)!
【云棲號在線課堂 社群】https://c.tb.cn/F3.Z8gvnK
原文發(fā)布時間:2020-07-17
本文作者:花括號MC
本文來自:“掘金”,了解相關(guān)信息可以關(guān)注“掘金”
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的一篇小文带你走进RabbitMQ的世界的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Scheduled SQL: SLS 大
- 下一篇: 云原生时代微服务的高可用架构设计