消息中間件利用高效可靠的消息傳遞機(jī)制進(jìn)行平臺(tái)無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成。通過提供消息傳遞和消息排隊(duì)模型,它可以在分布式環(huán)境下擴(kuò)展進(jìn)程間的通信。對(duì)于消息中間件,常見角色大致也就有 Producer(生產(chǎn)者)、Consumer(消費(fèi)者)。
常見的消息中間件產(chǎn)品:
1). ActiveMQ
ActiveMQ 是 Apache 出品,最流行的,能力強(qiáng)勁的開源消息總線。ActiveMQ 是一個(gè)完全支持 JMS1.1 和 J2EE 1.4 規(guī)范的 JMS Provider 實(shí)現(xiàn)。我們?cè)诒敬握n程中介紹 ActiveMQ 的使用。
2). RabbitMQ
AMQP 協(xié)議的領(lǐng)導(dǎo)實(shí)現(xiàn),支持多種場(chǎng)景。淘寶的 MySQL 集群內(nèi)部有使用它進(jìn)行通訊,
OpenStack 開源云平臺(tái)的通信組件,最先在金融行業(yè)得到運(yùn)用。
3). ZeroMQ
添加筆者微信,有更多整理好的java微服務(wù)筆記、源碼、精選面試題!
史上最快的消息隊(duì)列系統(tǒng)
4). Kafka
Apache 下的一個(gè)子項(xiàng)目 。特點(diǎn):高吞吐,在一臺(tái)普通的服務(wù)器上既可以達(dá)到 10W/s
的吞吐速率;完全的分布式系統(tǒng)。適合處理海量數(shù)據(jù)
1). 解耦 :中間件中的生產(chǎn)者只管發(fā)送消息 , 消費(fèi)者只要從隊(duì)列當(dāng)中獲取消息進(jìn)行消費(fèi)就可以 , 從而來實(shí)現(xiàn)業(yè)務(wù)的解耦 .
2). 冗余存儲(chǔ) : 有些情況下,處理數(shù)據(jù)的過程會(huì)失敗。消息中間件可以把數(shù)據(jù)進(jìn)行持久化直 到它們已經(jīng)被完全處理,通過這一方式規(guī)避了數(shù)據(jù)丟失風(fēng)險(xiǎn)。在把一個(gè)消息從消息中間件中刪 除之前,需要你的處理系統(tǒng)明確地指出該消息己經(jīng)被處理完成,從而確保你的數(shù)據(jù)被安全地保 存直到你使用完畢。
3). 可恢復(fù)性: 當(dāng)系統(tǒng)一部分組件失效時(shí),不會(huì)影響到整個(gè)系統(tǒng) 。 消息中間件降低了進(jìn)程間的 稿合度,所以即使一個(gè)處理消息的進(jìn)程掛掉,加入消息中間件中的消息仍然可以在系統(tǒng)恢復(fù)后 進(jìn)行處理 。
4). 順序保證: 在大多數(shù)使用場(chǎng)景下,數(shù)據(jù)處理的順序很重要,大部分消息中間件支持一定程 度上的順序性。
5). 緩沖: 在任何重要的系統(tǒng)中,都會(huì)存在需要不同處理時(shí)間的元素。消息中間件通過一個(gè)緩 沖層來幫助任務(wù)最高效率地執(zhí)行,寫入消息中間件的處理會(huì)盡可能快速 。
6). 異步通信: 在很多時(shí)候應(yīng)用不想也不需要立即處理消息 。 消息中間件提供了異步處理機(jī)制,允許應(yīng)用把一些消息放入消息中間件中,但并不立即處理它,在之后需要的時(shí)候再慢慢處理 。
3.1 安裝依賴環(huán)境
rpm -ivh erlang-20.3.8.6-1.el6.x86_64.rpm
yum -y install epel-release
yum -y install socat
3.2 安裝 rabbitMQ
rpm -ivh rabbitmq-server-3.7.7-1.el6.noarch.rpm
添加筆者微信,有更多整理好的java微服務(wù)筆記、源碼、精選面試題!
3.3 添加用戶
默認(rèn)情況下管理界面只能在 Linux 系統(tǒng)本機(jī)可以訪問, 如果想其他的主機(jī)也能訪問,需要配置:
rabbitmq-plugins enable rabbitmq_management
添加訪問用戶:
rabbitmqctl add_user admin admin
3.4 RabbitMQ 啟動(dòng)/停止
啟動(dòng) : service rabbitmq-server start
停止: service rabbitmq-server stop
查看狀態(tài): service rabbitmq-server status
4.1 Overview 概 要
該欄目主要展示的是 MQ 的概要信息 , 如消息的數(shù)量, Connection , Channel, Exchange , Queue , Consumer 的數(shù)量.
RabbitMQ 使用指南
4.2 Exchange 交換器
該欄目主要展示的是當(dāng)前虛擬主機(jī)下的交換器,也可以在此添加一個(gè)新的交換器, 并且配置對(duì)應(yīng)的交換器的規(guī)則屬性。
RabbitMQ 使用指南
4.3 Queues 隊(duì) 列
該欄目展示的是消息隊(duì)列的信息,里面有各個(gè)隊(duì)列的概要信息, 也可以在此欄目添加隊(duì)列
Queue
RabbitMQ 使用指南
4.4 Admin 系統(tǒng)管理
該欄目展示的是用戶管理的信息, 包含用戶列表的展示,添加用戶,添加虛擬主機(jī)等信息
RabbitMQ 使用指南
5.1 生產(chǎn)者與消費(fèi)者
5.1.1 生產(chǎn)者
Producer: 生產(chǎn)者,就是投遞消息的一方。
生產(chǎn)者創(chuàng)建消息,然后發(fā)布到 RabbitMQ 中。消息一般可以包含 2 個(gè)部分:消息體和標(biāo)簽 (Label)。消息體也可以稱之為 payload ,在實(shí)際應(yīng)用中,消 息體一般是一個(gè)帶有業(yè)務(wù)邏輯結(jié)構(gòu) 的數(shù)據(jù),比如一個(gè) JSON 字符串。當(dāng)然可以進(jìn)一步對(duì)這個(gè)消息體進(jìn)行序列化操作。消息的標(biāo)簽用來表述這條消息 , 比如 一個(gè)交換器的名稱和一個(gè)路由鍵 。 生產(chǎn)者把消息交由 RabbitMQ , RabbitMQ 之后會(huì)根據(jù)標(biāo)簽把消息發(fā)送給感興趣的消費(fèi)者(Consumer ) 。
添加筆者微信,有更多整理好的java微服務(wù)筆記、源碼、精選面試題!
5.1.2 消費(fèi)者
Consumer: 消費(fèi)者 ,就是接收消息的一方。
消費(fèi)者連接到 RabbitMQ 服務(wù)器,并訂閱到隊(duì)列上 。當(dāng)消費(fèi)者消費(fèi)一 條消息時(shí) , 只是消費(fèi)消息的消息體(payload )。在消息路由的過程中 ,消息的標(biāo)簽會(huì)丟棄 ,存入到隊(duì)列中的消息只有消息體,消費(fèi)者也只會(huì)消費(fèi)到消息體 ,也就不知道消息的生產(chǎn)者是誰,當(dāng)然消費(fèi)者也不需要知道 。
5.2 隊(duì)列
Queue: 隊(duì)列,是 RabbitMQ 的內(nèi)部對(duì)象,用 于存儲(chǔ)消息。
RabbitMQ 使用指南
5.3 交換器, 路由鍵, 綁定
5.3.1 交換器
Exchange: 交換器。在上圖中我們暫時(shí)可以理解成生產(chǎn)者將消息投遞到隊(duì)列中,實(shí)際上 這個(gè)在 RabbitMQ 中不會(huì)發(fā)生。真實(shí)情況是,生產(chǎn)者將消息發(fā)送到 Exchange (交換器),由交換器將消息路由到一個(gè)或者多個(gè)隊(duì)列中。如果路由不到,或 許會(huì)返回給生產(chǎn)者, 或許直接丟棄。這里可以將RabbitMQ 中的交換器看作一個(gè)簡(jiǎn)單的實(shí)體。
RabbitMQ 使用指南
RabbitMQ 中的 交換器有四種類型, 四種類型分別是 fanout、direct、topic 、headers,不同的類型有著不 同的路由策略。
5.3.2 路由鍵
RoutingKey : 路由鍵 。
生產(chǎn)者將消息發(fā)給交換器 的時(shí)候, 一般會(huì)指定 一個(gè) RoutingKey ,用 來指定這個(gè)消息的路由規(guī)則,而這個(gè) RoutingKey 需要與交換器類型和綁定鍵 (BindingKey) 聯(lián)合使用才能最終生效。
在交換器類型和綁定鍵 (BindingKey) 固定的情況下,生產(chǎn)者可以在發(fā)送消息給交換器時(shí), 通過指定 RoutingKey 來決定消息流向哪里。
5.3.3 綁定
Binding: 綁定。RabbitMQ 中通過綁定將交換器與隊(duì)列關(guān)聯(lián)起來,在綁定的時(shí)候一般會(huì)指定一個(gè)綁定鍵(BindingKey) ,這樣 RabbitMQ 就知道如何正確地將消息路由到隊(duì)列了。
5.4 交換器類型
1).fanout : 它會(huì)把所有發(fā)送到該交換器的消息路由到所有與該交換器綁定的隊(duì)列中。
2).direct: 該類型的交換器路由規(guī)則也很簡(jiǎn)單, 它會(huì)把消息路由到那些
BindingKey 和 RoutingKey 完全匹配的隊(duì)列中。
3).topic : 前面講到 direct 類型的交換器路由規(guī)則是完全匹配 BindingKey和 RoutingKey ,但是這種嚴(yán)格的匹配方式在很多情況下不能滿足實(shí)際業(yè)務(wù)的需求。topic 類型的交換器在匹配規(guī)則上進(jìn)行了擴(kuò)展,它與 direct 類型的交換器相似,也是將消息路由到 BindingKey 和 RoutingKey 相匹配的隊(duì) 列中,但這里的匹配規(guī)則有些不同,它約定:
RoutingKey 為一個(gè)點(diǎn)號(hào)"." 分割的字符串 , 如 : com.itcast.client , com.itheima.exam。
BindingKey 與 RoutingKey 一樣也是點(diǎn)號(hào)"." 分割的字符串。
BindingKey 中可以存在兩種特殊的字符串 "*" 和 "#" , 用于模糊匹配,其中
"#"用于匹配一個(gè)單詞, "*"用于匹配多個(gè)單個(gè)(可以是零個(gè))。
4). headers : 該類型的交換器不依賴于路由鍵的匹配規(guī)則來路由消息,而是根據(jù)發(fā)送的消息內(nèi)容中 的 headers 屬性進(jìn)行匹配。
6.1 隊(duì)列綁定
6.1.1 創(chuàng)建隊(duì)列
在 RabbitMQ 的后臺(tái)管理界面中創(chuàng)建一個(gè)隊(duì)列 , 指定隊(duì)列名稱。
RabbitMQ 使用指南
6.1.2 創(chuàng)建交換器 Exchange
在 RabbitMQ 的后臺(tái)管理界面中創(chuàng)建一個(gè)交換器,指定交換器的名稱, 并且指定交換器類型。
RabbitMQ 使用指南
6.1.3 綁定隊(duì)列與交換器
在交換器列表點(diǎn)擊對(duì)應(yīng)的交換器 , 進(jìn)入到綁定界面 , 指定隊(duì)列名稱 queue , 指定 RoutingKey , 通過該 RoutingKey 來綁定該隊(duì)列與交換器 Exchange 。
RabbitMQ 使用指南
之后,在發(fā)送消息時(shí), 指定了 Exchange ,及 RoutingKey, 就可以將該消息路由到該隊(duì)列 queue 中。
RabbitMQ 使用指南
6.2 發(fā)送消息邏輯代碼
6.2.1 引入依賴
RabbitMQ 使用指南
6.2.2 發(fā)送消息
RabbitMQ 使用指南
RabbitMQ 使用指南
6.3 發(fā)送消息平臺(tái)監(jiān)測(cè)
RabbitMQ 使用指南
7.1 引入依賴
RabbitMQ 使用指南
7.2 接收消息
RabbitMQ 使用指南
RabbitMQ 使用指南
7.3 結(jié)果輸出
RabbitMQ 使用指南
其中:
consumerTag : 消息消費(fèi)者的標(biāo)簽
properties : 消息內(nèi)容的頭信息數(shù)據(jù)
envelope : 消息體的數(shù)據(jù)包,其中包含消息發(fā)送時(shí)指定的exchange, routingKey等信息.