天天看點

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

目錄

1.RabbitMQ概述

簡介:

術語說明:

什麼是JMS:

JMS底層架構圖:

2.RabbitMQ安裝啟動與管理

2.1 Windows64位環境下安裝RabbitMQ

2.2 Linux環境下安裝RabbitMQ-----沒有實操

先安裝Erlang

再安裝RabbitMQ

操作指令:

開啟web界面管理工具

防火牆開放15672端口通路

2.3RabbitMQ管理界面添加使用者和Virtual host

Add a user

Admin-Virtual Host

3.RabbitMQ的五種隊列模式與執行個體

3.1 簡單模式Hello World

通用工具類:

生産者實作思路:

消費者實作思路

3.2 工作隊列模式Work Queue

生産者實作思路:

消費者實作思路:

結果:

3.3釋出/訂閱模式 Publish/Subscribe

生産者實作思路:

消費者實作思路:

3.4路由模式Routing

生産者實作思路:

消費者實作思路:

3.5通配符模式Topic

生産者實作思路:

消費者實作思路:

4.Spring內建RabbitMQ配置

一、消息持久化機制

1、queue: 

2、message:

3、exchange:

二、消息确認模式-------發送方确認消息發送到Broker的解決方案

三、消費者确認模式------消息消費者的消費是成功還是失敗的解決方案

1、消息回執模式

2、拒絕消息模式

3、消息預取模式

5.總結

1.RabbitMQ概述

簡介:

  • MQ全稱為Message Queue,消息隊列是應用程式和應用程式之間的通信方法;
  • RabbitMQ是開源的,實作了AMQP協定的,采用Erlang(面向并發程式設計語言)編寫的,可複用的企業級消息系統;
  • AMQP(進階消息隊列協定)是網絡協定,是一個異步消息傳遞所使用應用層協定規範,為面向消息中間件設計,基于此協定的用戶端與消息中間件可以無視消息來源傳遞消息,不受用戶端、消息中間件、不同的開發語言環境等條件的限制;
  • 支援主流作業系統:Linux、Windows,MacOX等;
  • 支援多種用戶端開發語言:Java、Python、Ruby、.NET,PHP、C/C++、Node.js等

術語說明:

  • Server(Broker):接收用戶端連接配接,實作AMQP協定的消息隊列和路由功能的程序;
  • Virtual Host:虛拟主機的概念,類似權限控制組,一個Virtual Host裡可以有多個Exchange和Queue,權限控制的最小力度是Virtual Host;
  • Exchange:交換機,接收生産者發送的消息,并根據 Routing Key ;路由關鍵字,将消息路由到伺服器中的隊列Queue。
  • ExchangeType:交換機類型決定了路由消息行為,RabbitMQ中常用有三種類型Exchange,分别是fanout、direct、topic、(header);
  • Message Queue:消息隊列,用于存儲還未被消費者消費的消息;
  • Message:由Header和body組成,Header是由生産者添加的各種屬性的集合,包括Message是否被持久化、優先級是多少、由哪個Message Queue接收等;body是真正需要發送的資料内容; BindingKey:綁定關鍵字,将一個特定的Exchange和一個特定的Queue綁定起來

上圖:

  •     RabbitMQ是基于AMQP(Advanced Message Queuting Protocol)
  •     ActiveMQ、RocketMQ 是基于JMS 開發的
  •     Kafka 是基于釋出訂閱開發的消息系統

  這個圖是關RabbitMQ的底層實作圖,是完全根據AMQP的約定來開發的

  • 【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

什麼是JMS:

查了很多部落格,都講的JMS是什麼怎麼用,都說他是J2EE的13個規範中的一個API,那我們從哪裡取找它?更直覺的認識他? 我在ActiveMQ的安裝包中找到的

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結
【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

JMS底層架構圖:

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

JMS即 Java消息服務(Java Message Service)應用程式接口, 是一個Java平台中關于面向消息中間件(MOM)的API, 用于在兩個應用程式之間,或分布式系統中發送消息,進行異步通信。 Java消息服務是一個與具體平台無關的API,絕大多數MOM提供商都對JMS提供支援   《分布式消息中間件實踐》中這樣描述:JMS規範是對AMQP 、STOMP等消息通信協定的更高一層的抽象  

JMS和AMQP的差別     1 通信平台的差別 JMS:  隻允許基于JAVA實作的消息平台的之間進行通信 AMQP: 允許多種消息協定進行通信,比如ruby的storm和java的jms都可以在AMQP上進行通信。 結論: AMQP允許多種技術同時進行協定通信       2 通信機制的差別 JMS:消息生産者和消息消費者必須知道對方的Queue AMQP: 消息生産者和消息消費者無須知道對方的Queue,消息生産者将Exchange通過Route key和任意Queue綁定。消息消費者通過Route key從任意Queue中擷取Exchange.     3 消息傳輸機制的差別 JMS:JMS支援PTP和publis/subscribe機制,PTP隻可以點對點通信,public/subscribe在一端送出請求後所有其他端收到消息 AMQP:1 所有RouteKey相同的Queue接受到資料              2 所有相同的Exchange的Queue接受到資料              3 所有wilecard的Exchange的Queue接受到資料              4 可以讓webservice等接受到資料  

2.RabbitMQ安裝啟動與管理

2.1 Windows64位環境下安裝RabbitMQ

到RabbitMQ官網下載下傳win64位最新版erlang和rabbitmq-server的安裝包,分别是 erlang otp_win64_19.3和rabbitmq-server-3.6.9。注意安裝時計算機全名最好是英文,先安裝erlang,再安裝rabbitmq-server,根據安裝向導,采用預設安裝配置即可。安裝完成後,可以從開始-所有程式中找到RabbitMQ Server如下圖所示:

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

    點RabbitMQ Command Prompt啟動指令行,輸入rabbitmq-plugins enable rabbitmq_management

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

    啟動管理工具,在浏覽器中輸入 http://127.0.0.1:15672/即可打開管理登入界面,預設超級管理者使用者名guest,密碼guest

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

2.2 Linux環境下安裝RabbitMQ-----沒有實操

先安裝Erlang

wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm rpm -Uvh erlang-solutions-1.0-1.noarch.rpm rpm --import http://packages.erlang-solutions.com/rpm/erlang_solutions.asc sudo yum install erlang

再安裝RabbitMQ

rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc yum install rabbitmq-server-3.6.9-1.noarch.rpm

操作指令:

啟動 service rabbitmq-server start 停止 service rabbitmq-server stop 重新開機 service rabbitmq-server restart 設定開機啟動 chkconfig rabbitmq-server on

開啟web界面管理工具

rabbitmq-plugins enable rabbitmq_management service rabbitmq-server restart

防火牆開放15672端口通路

/sbin/iptables -I INPUT -p tcp --dport 15672 -j ACCEPT /etc/rc.d/init.d/iptables save

2.3RabbitMQ管理界面添加使用者和Virtual host

Admin-Users-Add a user  

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

Add a user

  Tags:使用者角色說明 ** 超級管理者(administrator)** 可登陸管理控制台,可檢視所有的資訊,并且可以對使用者,政策(policy)進行操作。 監控者(monitoring) 可登陸管理控制台,同時可以檢視rabbitmq節點的相關資訊(程序數,記憶體使用情況,磁盤使用情況等) 政策制定者(policymaker) 可登陸管理控制台, 同時可以對policy進行管理,但無法檢視節點的相關資訊。 普通管理者(management) 僅可登陸管理控制台,無法看到節點資訊,也無法對政策進行管理。 其他none 無法登陸管理控制台,通常就是普通的生産者和消費者。 Admin-Virtual Host-Add virtual host  

Admin-Virtual Host

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

添加virtual host和使用者後,需要為使用者指定virtual host,之後用該使用者可以登入

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

3.RabbitMQ的五種隊列模式與執行個體

3.1 簡單模式Hello World

  簡單模式Hello World

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

通用工具類:

建立連接配接工廠ConnectionFactory,設定服務位址127.0.0.1,端口号5672,設定使用者名、密碼、virtual host

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

功能:一個生産者P發送消息到隊列Q,一個消費者C接收

生産者實作思路:

從連接配接工廠中擷取連接配接connection,使用連接配接建立通道channel,使用通道channel建立隊列queue,使用通道channel向隊列中發送消息,關閉通道和連接配接。

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

消費者實作思路

 建立消費者并監聽隊列,從隊列中讀取消息。

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

3.2 工作隊列模式Work Queue

  工作隊列模式Work Queue

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

功能:一個生産者,多個消費者,每個消費者擷取到的消息唯一,多個消費者隻有一個隊列 任務隊列:避免立即做一個資源密集型任務,必須等待它完成,而是把這個任務安排到稍後再做。我們将任務封裝為消息并将其發送給隊列。背景運作的工作程序将彈出任務并最終執行作業。當有多個worker同時運作時,任務将在它們之間共享。

生産者實作思路:

建立連接配接工廠ConnectionFactory,設定服務位址127.0.0.1,端口号5672,設定使用者名、密碼、virtual host,從連接配接工廠中擷取連接配接connection,使用連接配接建立通道channel,使用通道channel建立隊列queue,使用通道channel向隊列中發送消息,10條消息之間間隔一定時間,關閉通道和連接配接。

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

消費者實作思路:

建立消費者Recver1并監聽隊列,擷取消息并暫停10ms,另外一個消費者Recver2暫停1000ms,由于消費者1消費速度快,是以2可以執行更多的任務。

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結
【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

結果:

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

3.3釋出/訂閱模式 Publish/Subscribe

  釋出/訂閱模式 Publish/Subscribe

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

功能:一個生産者發送的消息會被多個消費者擷取。一個生産者、一個交換機、多個隊列、多個消費者 生産者:可以将消息發送到隊列或者是交換機。 消費者:隻能從隊列中擷取消息。 如果消息發送到沒有隊列綁定的交換機上,那麼消息将丢失。 交換機不能存儲消息,消息存儲在隊列中

生産者實作思路:

建立連接配接工廠ConnectionFactory,設定服務位址127.0.0.1,端口号5672,設定使用者名、密碼、virtual host,從連接配接工廠中擷取連接配接connection,使用連接配接建立通道channel,使用通道channel建立隊列queue,使用通道channel建立交換機并指定交換機類型為fanout,使用通道向交換機發送消息,關閉通道和連接配接。

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

消費者實作思路:

建立連接配接工廠ConnectionFactory,設定服務位址127.0.0.1,端口号5672,設定使用者名、密碼、virtual host,從連接配接工廠中擷取連接配接connection,使用連接配接建立通道channel,使用通道channel建立隊列queue,綁定隊列到交換機,設定Qos=1,建立消費者并監聽隊列,使用手動方式傳回完成。可以有多個隊列綁定到交換機,多個消費者進行監聽。

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結
【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

3.4路由模式Routing

  路由模式Routing

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

說明:生産者發送消息到交換機并且要指定路由key,消費者将隊列綁定到交換機時需要指定路由key

生産者實作思路:

建立連接配接工廠ConnectionFactory,設定服務位址127.0.0.1,端口号5672,設定使用者名、密碼、virtual host,從連接配接工廠中擷取連接配接connection,使用連接配接建立通道channel,使用通道channel建立隊列queue,使用通道channel建立交換機并指定交換機類型為direct,使用通道向交換機發送消息并指定key=a,關閉通道和連接配接。

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

消費者實作思路:

建立連接配接工廠ConnectionFactory,設定服務位址127.0.0.1,端口号5672,設定使用者名、密碼、virtual host,從連接配接工廠中擷取連接配接connection,使用連接配接建立通道channel,使用通道channel建立隊列queue,綁定隊列到交換機,設定Qos=1,建立消費者并監聽隊列,使用手動方式傳回完成。可以有多個隊列綁定到交換機,但隻要綁定key=a的隊列key接收到消息,多個消費者進行監聽。

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

3.5通配符模式Topic

  通配符模式Topic

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結
【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

說明:生産者P發送消息到交換機X,type=topic,交換機根據綁定隊列的routing key的值進行通配符比對; 符号#:比對一個或者多個詞 lazy.# 可以比對 lazy.irs或者lazy.irs.cor 符号*:隻能比對一個詞 lazy.* 可以比對 lazy.irs或者lazy.cor

生産者實作思路:

使用通道channel建立交換機并指定交換機類型為topic,使用通道向交換機發送消息并指定key=key.1,關閉通道和連接配接。

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

消費者實作思路:

可以有多個隊列綁定到交換機,凡是綁定規則符合通配符規則的隊列均可以接收到消息,比如key.*,key.#,多個消費者進行監聽。

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

解釋一下routingKey 和bindingKey:  如圖:key.xml就是RoutingKey,key.*就是BindingKey

4.Spring內建RabbitMQ配置

Spring提供了AMQP的一個實作,并且spring-rabbit是RabbitMQ的一個實作,下面給出訂閱者模式的事例配置如下:

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結
【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

補充:消息可靠性的相關配置:

一、消息持久化機制

1、queue: 

從exchange---->queue:保證在queue中

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

2、message:

在queue中的每個message保證持久化

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結
【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

3、exchange:

從消息生産端--->exchange: 保證在exchange可持久化的參數 但是從性能的角度,對于傳送的消息全部寫入磁盤效率無非是很低的,還可以有另外一個思路,監聽消息響應, 來确定消息是否發送到了exchange,如果沒有響應選擇重新發送

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

二、消息确認模式-------發送方确認消息發送到Broker的解決方案

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

三、消費者确認模式------消息消費者的消費是成功還是失敗的解決方案

1、消息回執模式

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

2、拒絕消息模式

3、消息預取模式

來解決有的消費者處理很快,出現資源空閑的情況,為了能做到能者多勞的情況,設定在一定範圍内可以盡量多的處理消息:

【中間件】RabbitMQ學習小結---五種隊列模式1.RabbitMQ概述2.RabbitMQ安裝啟動與管理3.RabbitMQ的五種隊列模式與執行個體4.Spring內建RabbitMQ配置5.總結

5.總結

RabbitMQ提供6種模式,分别是Hello,Work Queue,Publish/Subscribe,Routing,Topics,RPC Request/reply,本文詳細講述了前5種,并給出代碼實作和思路。 其中Publish/Subscribe,Routing,Topics三種模式可以統一歸為Exchange模式,隻是建立時交換機的類型不一樣,分别是fanout、direct、topic。 Spring提供了rabbitmq的一個實作  

注:根據該部落格内容實踐後,參考總結的 作者:梁朋舉 連結: https://www.jianshu.com/p/80eefec808e5