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