消息中間件利用高效可靠的消息傳遞機制進行平臺無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進行分布式系統(tǒng)的集成。通過提供消息傳遞和消息排隊模型,它可以在分布式環(huán)境下擴展進程間的通信。對于消息中間件,常見角色大致也就有
Producer(生產(chǎn)者)、Consumer(消費者)。
常見的消息中間件產(chǎn)品:
1). ActiveMQ
ActiveMQ 是 Apache 出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持 JMS1.1 和 J2EE 1.4 規(guī)范的 JMS Provider 實現(xiàn)。我們在本次課程中介紹 ActiveMQ 的使用。
2). RabbitMQ
AMQP 協(xié)議的領(lǐng)導(dǎo)實現(xiàn),支持多種場景。淘寶的 MySQL 集群內(nèi)部有使用它進行通訊,
OpenStack 開源云平臺的通信組件,最先在金融行業(yè)得到運用。
3). ZeroMQ
添加筆者微信YDT787,有更多整理好的java微服務(wù)筆記、源碼、精選面試題!
史上最快的消息隊列系統(tǒng)
4). Kafka
Apache 下的一個子項目 。特點:高吞吐,在一臺普通的服務(wù)器上既可以達到 10W/s
的吞吐速率;完全的分布式系統(tǒng)。適合處理海量數(shù)據(jù)
1). 解耦 :中間件中的生產(chǎn)者只管發(fā)送消息 , 消費者只要從隊列當(dāng)中獲取消息進行消費就可以 , 從而來實現(xiàn)業(yè)務(wù)的解耦 .
2). 冗余存儲 : 有些情況下,處理數(shù)據(jù)的過程會失敗。消息中間件可以把數(shù)據(jù)進行持久化直
到它們已經(jīng)被完全處理,通過這一方式規(guī)避了數(shù)據(jù)丟失風(fēng)險。在把一個消息從消息中間件中刪
除之前,需要你的處理系統(tǒng)明確地指出該消息己經(jīng)被處理完成,從而確保你的數(shù)據(jù)被安全地保 存直到你使用完畢。
3). 可恢復(fù)性: 當(dāng)系統(tǒng)一部分組件失效時,不會影響到整個系統(tǒng) 。 消息中間件降低了進程間的 稿合度,所以即使一個處理消息的進程掛掉,加入消息中間件中的消息仍然可以在系統(tǒng)恢復(fù)后 進行處理 。
4). 順序保證: 在大多數(shù)使用場景下,數(shù)據(jù)處理的順序很重要,大部分消息中間件支持一定程 度上的順序性。
5). 緩沖: 在任何重要的系統(tǒng)中,都會存在需要不同處理時間的元素。消息中間件通過一個緩 沖層來幫助任務(wù)最高效率地執(zhí)行,寫入消息中間件的處理會盡可能快速 。
6). 異步通信: 在很多時候應(yīng)用不想也不需要立即處理消息 。 消息中間件提供了異步處理機制,允許應(yīng)用把一些消息放入消息中間件中,但并不立即處理它,在之后需要的時候再慢慢處理 。
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
添加筆者微信YDT787,有更多整理好的java微服務(wù)筆記、源碼、精選面試題!
3.3 添加用戶
默認(rèn)情況下管理界面只能在 Linux 系統(tǒng)本機可以訪問, 如果想其他的主機也能訪問,需要配置:
rabbitmq-plugins enable rabbitmq_management
添加訪問用戶:
rabbitmqctl add_user admin admin
3.4 RabbitMQ 啟動/停止
啟動 : 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)前虛擬主機下的交換器,也可以在此添加一個新的交換器, 并且配置對應(yīng)的交換器的規(guī)則屬性。

RabbitMQ 使用指南
4.3 Queues 隊 列
該欄目展示的是消息隊列的信息,里面有各個隊列的概要信息, 也可以在此欄目添加隊列
Queue

RabbitMQ 使用指南
4.4 Admin 系統(tǒng)管理
該欄目展示的是用戶管理的信息, 包含用戶列表的展示,添加用戶,添加虛擬主機等信息

RabbitMQ 使用指南
5.1 生產(chǎn)者與消費者
5.1.1 生產(chǎn)者
Producer: 生產(chǎn)者,就是投遞消息的一方。
生產(chǎn)者創(chuàng)建消息,然后發(fā)布到 RabbitMQ 中。消息一般可以包含 2 個部分:消息體和標(biāo)簽 (Label)。消息體也可以稱之為
payload ,在實際應(yīng)用中,消 息體一般是一個帶有業(yè)務(wù)邏輯結(jié)構(gòu) 的數(shù)據(jù),比如一個 JSON
字符串。當(dāng)然可以進一步對這個消息體進行序列化操作。消息的標(biāo)簽用來表述這條消息 , 比如 一個交換器的名稱和一個路由鍵 。 生產(chǎn)者把消息交由
RabbitMQ , RabbitMQ 之后會根據(jù)標(biāo)簽把消息發(fā)送給感興趣的消費者(Consumer ) 。
添加筆者微信YDT787,有更多整理好的java微服務(wù)筆記、源碼、精選面試題!
5.1.2 消費者
Consumer: 消費者 ,就是接收消息的一方。
消費者連接到 RabbitMQ 服務(wù)器,并訂閱到隊列上 。當(dāng)消費者消費一 條消息時 , 只是消費消息的消息體(payload
)。在消息路由的過程中 ,消息的標(biāo)簽會丟棄 ,存入到隊列中的消息只有消息體,消費者也只會消費到消息體
,也就不知道消息的生產(chǎn)者是誰,當(dāng)然消費者也不需要知道 。
5.2 隊列
Queue: 隊列,是 RabbitMQ 的內(nèi)部對象,用 于存儲消息。

RabbitMQ 使用指南
5.3 交換器, 路由鍵, 綁定
5.3.1 交換器
Exchange: 交換器。在上圖中我們暫時可以理解成生產(chǎn)者將消息投遞到隊列中,實際上 這個在 RabbitMQ
中不會發(fā)生。真實情況是,生產(chǎn)者將消息發(fā)送到 Exchange (交換器),由交換器將消息路由到一個或者多個隊列中。如果路由不到,或
許會返回給生產(chǎn)者, 或許直接丟棄。這里可以將RabbitMQ 中的交換器看作一個簡單的實體。

RabbitMQ 使用指南
RabbitMQ 中的 交換器有四種類型, 四種類型分別是 fanout、direct、topic 、headers,不同的類型有著不 同的路由策略。
5.3.2 路由鍵
RoutingKey : 路由鍵 。
生產(chǎn)者將消息發(fā)給交換器 的時候, 一般會指定 一個 RoutingKey ,用 來指定這個消息的路由規(guī)則,而這個 RoutingKey 需要與交換器類型和綁定鍵 (BindingKey) 聯(lián)合使用才能最終生效。
在交換器類型和綁定鍵 (BindingKey) 固定的情況下,生產(chǎn)者可以在發(fā)送消息給交換器時, 通過指定 RoutingKey 來決定消息流向哪里。
5.3.3 綁定
Binding: 綁定。RabbitMQ 中通過綁定將交換器與隊列關(guān)聯(lián)起來,在綁定的時候一般會指定一個綁定鍵(BindingKey) ,這樣 RabbitMQ 就知道如何正確地將消息路由到隊列了。
5.4 交換器類型
1).fanout : 它會把所有發(fā)送到該交換器的消息路由到所有與該交換器綁定的隊列中。
2).direct: 該類型的交換器路由規(guī)則也很簡單, 它會把消息路由到那些
BindingKey 和 RoutingKey 完全匹配的隊列中。
3).topic : 前面講到 direct 類型的交換器路由規(guī)則是完全匹配 BindingKey和 RoutingKey
,但是這種嚴(yán)格的匹配方式在很多情況下不能滿足實際業(yè)務(wù)的需求。topic 類型的交換器在匹配規(guī)則上進行了擴展,它與 direct
類型的交換器相似,也是將消息路由到 BindingKey 和 RoutingKey 相匹配的隊 列中,但這里的匹配規(guī)則有些不同,它約定:
RoutingKey 為一個點號"." 分割的字符串 , 如 : com.itcast.client , com.itheima.exam。
BindingKey 與 RoutingKey 一樣也是點號"." 分割的字符串。
BindingKey 中可以存在兩種特殊的字符串 "*" 和 "#" , 用于模糊匹配,其中
"#"用于匹配一個單詞, "*"用于匹配多個單個(可以是零個)。
4). headers : 該類型的交換器不依賴于路由鍵的匹配規(guī)則來路由消息,而是根據(jù)發(fā)送的消息內(nèi)容中 的 headers 屬性進行匹配。
6.1 隊列綁定
6.1.1 創(chuàng)建隊列
在 RabbitMQ 的后臺管理界面中創(chuàng)建一個隊列 , 指定隊列名稱。

RabbitMQ 使用指南
6.1.2 創(chuàng)建交換器 Exchange
在 RabbitMQ 的后臺管理界面中創(chuàng)建一個交換器,指定交換器的名稱, 并且指定交換器類型。

RabbitMQ 使用指南
6.1.3 綁定隊列與交換器
在交換器列表點擊對應(yīng)的交換器 , 進入到綁定界面 , 指定隊列名稱 queue , 指定 RoutingKey , 通過該 RoutingKey 來綁定該隊列與交換器 Exchange 。

RabbitMQ 使用指南
之后,在發(fā)送消息時, 指定了 Exchange ,及 RoutingKey, 就可以將該消息路由到該隊列 queue 中。

RabbitMQ 使用指南
6.2 發(fā)送消息邏輯代碼
6.2.1 引入依賴

RabbitMQ 使用指南
6.2.2 發(fā)送消息

RabbitMQ 使用指南

RabbitMQ 使用指南
6.3 發(fā)送消息平臺監(jiān)測

RabbitMQ 使用指南
7.1 引入依賴

RabbitMQ 使用指南
7.2 接收消息

RabbitMQ 使用指南

RabbitMQ 使用指南
7.3 結(jié)果輸出

RabbitMQ 使用指南
其中:
consumerTag : 消息消費者的標(biāo)簽
properties : 消息內(nèi)容的頭信息數(shù)據(jù)
envelope : 消息體的數(shù)據(jù)包,其中包含消息發(fā)送時指定的exchange, routingKey等信息.