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