1. 程式人生 > >RabbitMQ入門與訊息佇列模式詳解

RabbitMQ入門與訊息佇列模式詳解

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;
  •  Message Queue:訊息佇列,用於儲存還未被消費者消費的訊息;
  •  Message:由Header和body組成,Header是由生產者新增的各種屬性的集合,包括Message是否被持久化、優先順序是多少、由哪個Message Queue接收等;body是真正需要傳送的資料內容;
  • BindingKey:繫結關鍵字,將一個特定的Exchange和一個特定的Queue繫結起來。

2.RabbitMQ安裝啟動與管理

2.1 Windows64環境下安裝RabbitMQ

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

點RabbitMQ Command Prompt啟動命令列,輸入rabbitmq-plugins enablerabbitmq_management

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

2.2 Linux下安裝RabbitMQ

先安裝Erlang

rpm -Uvherlang-solutions-1.0-1.noarch.rpm

sudo yuminstall erlang

再安裝RabbitMQ

rpm --importhttps://www.rabbitmq.com/rabbitmq-release-signing-key.asc

yum installrabbitmq-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-pluginsenable rabbitmq_management

service rabbitmq-serverrestart

防火牆開放15672埠訪問

/sbin/iptables-I INPUT -p tcp --dport 15672 -j ACCEPT

/etc/rc.d/init.d/iptablessave

2.3 RabbitMQ新增使用者和Virtual Host

Admin-Users-Add a user

Tags:使用者角色說明

 超級管理員(administrator)

可登陸管理控制檯,可檢視所有的資訊,並且可以對使用者,策略(policy)進行操作。

監控者(monitoring)

可登陸管理控制檯,同時可以檢視rabbitmq節點的相關資訊(程序數,記憶體使用情況,磁碟使用情況等)

策略制定者(policymaker)

可登陸管理控制檯, 同時可以對policy進行管理,但無法檢視節點的相關資訊。

普通管理者(management)

僅可登陸管理控制檯,無法看到節點資訊,也無法對策略進行管理。

其他none

無法登陸管理控制檯,通常就是普通的生產者和消費者。

Admin-Virtual Host-Add virtual host

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


3.RabbitMQ的5種模式與例項

3.1 簡單模式Hello World

功能:一個生產者P傳送訊息到佇列Q,一個消費者C接收

生產者實現思路:

建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,使用通道channel向佇列中傳送訊息,關閉通道和連線。

 

消費者實現思路

建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue, 建立消費者並監聽佇列,從佇列中讀取訊息。

3.2 工作佇列模式Work Queue

功能:一個生產者,多個消費者,每個消費者獲取到的訊息唯一,多個消費者只有一個佇列

任務佇列:避免立即做一個資源密集型任務,必須等待它完成,而是把這個任務安排到稍後再做。我們將任務封裝為訊息並將其傳送給佇列。後臺執行的工作程序將彈出任務並最終執行作業。當有多個worker同時執行時,任務將在它們之間共享。

生產者實現思路:

建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,使用通道channel向佇列中傳送訊息,2條訊息之間間隔一定時間,關閉通道和連線。

消費者實現思路:

建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,建立消費者C1並監聽佇列,獲取訊息並暫停10ms,另外一個消費者C2暫停1000ms,由於消費者C1消費速度快,所以C1可以執行更多的任務。

3.3 釋出/訂閱模式Publish/Subscribe

功能:一個生產者傳送的訊息會被多個消費者獲取。一個生產者、一個交換機、多個佇列、多個消費者

生產者:可以將訊息傳送到佇列或者是交換機。

消費者:只能從佇列中獲取訊息。

如果訊息傳送到沒有佇列繫結的交換機上,那麼訊息將丟失。

交換機不能儲存訊息,訊息儲存在佇列中

生產者實現思路:

建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,使用通道channel建立交換機並指定交換機型別為fanout,使用通道向交換機發送訊息,關閉通道和連線。

消費者實現思路:

建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,繫結佇列到交換機,設定Qos=1,建立消費者並監聽佇列,使用手動方式返回完成。可以有多個佇列繫結到交換機,多個消費者進行監聽。

3.4 路由模式Routing

說明:生產者傳送訊息到交換機並且要指定路由key,消費者將佇列繫結到交換機時需要指定路由key

生產者實現思路:

建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,使用通道channel建立交換機並指定交換機型別為direct,使用通道向交換機發送訊息並指定key=b,關閉通道和連線。

消費者實現思路:

建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,繫結佇列到交換機,設定Qos=1,建立消費者並監聽佇列,使用手動方式返回完成。可以有多個佇列繫結到交換機,但只要繫結key=b的佇列key接收到訊息,多個消費者進行監聽。

3.5 萬用字元模式Topics  

說明:生產者P傳送訊息到交換機X,type=topic,交換機根據繫結佇列的routing key的值進行萬用字元匹配;符號#:匹配一個或者多個詞lazy.# 可以匹配lazy.irs或者lazy.irs.cor

符號*:只能匹配一個詞lazy.* 可以匹配lazy.irs或者lazy.cor

生產者實現思路:

建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,使用通道channel建立交換機並指定交換機型別為topic,使用通道向交換機發送訊息並指定key=key.1,關閉通道和連線。

 

消費者實現思路:

建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,繫結佇列到交換機,設定Qos=1,建立消費者並監聽佇列,使用手動方式返回完成。可以有多個佇列繫結到交換機,凡是繫結規則符合萬用字元規則的佇列均可以接收到訊息,比如key.*,key.#,多個消費者進行監聽。

4.spring整合rabbitmq配置

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

5.總結

RabbitMQ提供了6種模式,分別是HelloWorld,Work Queue,Publish/Subscribe,Routing,Topics,RPC Request/reply,本文詳細講述了前5種,並給出程式碼實現和思路。其中Publish/Subscribe,Routing,Topics三種模式可以統一歸為Exchange模式,只是建立時交換機的型別不一樣,分別是fanout、direct、topic。Spring提供了rabbitmq的一個實現,所以整合起來很方便,文章第4章給出了訂閱者模式的一種spring配置。

歡迎大家關注博主訂閱號“Java技術日誌”,提供Java相關技術分享,從Java程式設計基礎到Java高階技術,從JavaWeb技術基礎Jsp、Servlet、JDBC到SSH、SSM開發框架,從REST風格介面設計到分散式專案實戰。剖析主流開源技術框架,用親身實踐來譜寫深度Java技術日誌。


Java技術日誌

 歡迎加入QQ群:Java技術交流群 326303715