RabbitMQ入門,使用指南

2020-12-14 黑馬程式設計師

RabbitMQ 使用指南 1 MQ 簡介 消息中間件利用高效可靠的消息傳遞機制進行平臺無關的數據交流,並基於數據通信來 進行分布式系統的集成。通過提供消息傳遞和消息排隊模型,它可以在分布式環境下擴展進 程間的通信。對於消息中間件,常見 角色大致也就有 Producer (生產者)、 Consumer (消 費者) 。 常見的消息中間件產品 :1). ActiveMQ ActiveMQ 是 Apache 出品,最流行的,能力強勁的開源消息總線。 ActiveMQ 是 一個完全支持 JMS1.1 和 J2EE 1.4 規範的 JMS Provider 實現。我們在本次課程中 介紹 ActiveMQ 的使用。 2). RabbitMQ AMQP 協議的領導實現,支持多種場景。淘寶的 MySQL 集群內部有使用它進行通訊,OpenStack 開源雲平臺的通信組件,最先在金融行業得到運用。 3). ZeroMQ史上最快的消息隊列系統 4). Kafka Apache 下的一個子項目。特點:高吞吐,在一臺普通的伺服器上既可以達到 10W/s的吞吐速率;完全的分布式系統。適合處理海量數據 2 MQ 作用 1). 解耦 :中間件中的生產者只管發送消息 , 消費者只要從隊列當中獲取消息進行消費就可以 , 從而來實現業務的解耦。 2). 冗餘存儲 : 有些情況下,處理數據的過程會失敗。消息中間件可以把數據進行持久化直到它們已經被完全處理,通過這一方式規避了數據丟失風險。在把一個消息從消息中間 件中刪除之前,需要你的處理系統明確地指出該消息己經被處理完成,從而確保你的數據 被安全地保存直到 你使用完畢。 3). 可恢復性:當系統一部分組件失效時,不會影響到整個系統。消息中間件降低了進程間的稿合度,所以即使一個處理消息的進程掛掉,加入消息中間件中的消息仍然可以在系統恢復後進行處理 。

4). 順序保證:在大多數使用場景下,數據處理的順序很重要,大部分消息中間件支持一 定程度上的順序性。 5). 緩衝: 在任何重要的系統中,都會存在需要不同處理時間的元素。消息中間件通過一 個緩衝層來幫助任務最高效率地執行,寫入消息中間件的處理會儘可能快速 。

6). 異步通信:在很多時候應用不想也不 需要立即處理消息。消息中間件提供了異步處 理機制,允許應用把一些消息放入消息中間件中,但並不立即處理它,在之後需要的時候再慢慢處理 。 3 RabbitMQ 安裝及啟動 3.1 安裝依賴環境 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 3.3 添加用戶 默認情況下管理 界面只能在 Linux 系統本機可以訪問 , 如果想其他的主機也能訪問需要 配置:rabbitmq -plugins enable rabbitmq_management 添加訪問用戶:rabbitmqctl add_user admin admin 3.4 RabbitMQ 啟動 /停止 啟動 : service rabbitmq -server start 停止 : service rabbitmq -server stop 查看狀態 : service rabbitmq -server status

4 Rabbit MQ 管理界面訪問 4.1 Overview 概要 該 欄 目 主 要 展 示 的 是 MQ 的概要信息, 如消息的數量,Connection , Channel , Exchange , Queue , Consumer 的數量 .

4.2 Exchange 交換器 該欄目主要展示的是當前虛擬主機下的交換器,也可以在此添加一個新的交換器, 並且配置對應的交換器的規則屬性 。

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

4.4 Admin 系統管理 該欄目展示的是用戶管理的信息, 包含用戶列表的展示 ,添加用戶,添加虛擬主機等信息

5 RabbitMQ 的相關概念 5.1 生產者與消費者 5.1.1 生產者 Producer: 生產者,就是投遞消息的一方。 生產者創建消息,然後發布到 RabbitMQ 中。消息一般可以包含 2 個部分 :消息體和標籤 (Label) 。消息體也可以稱之為 payload ,在實際應用中,消 息體一般是一個帶有業務邏輯結構 的數據,比如一個 JSON 字符串。當然可以進一步對這個消息體進行序列 化操作。消息的標籤用來表述這條消息, 比如一個交換器的名稱和一個路由鍵。生產者把消息交由 RabbitMQ,RabbitMQ 之後會根據標籤把消息發送給感興趣的消費者(Consumer ) 。 5.1.2 消費者 Consumer: 消費者,就是接收消息的一方。 消費者連接到 RabbitMQ 伺服器,並訂閱到隊列上 。當消費者消費一條消息時 , 只是消費消息的消息體 (payload ) 。在消息路由的過程中,消息的標籤會丟棄, 存入到隊列中的消息只有消息體,消費者也只會消費到消息體,也就不知道消息的生產者是誰,當然消費者也不需要知道 。 5.2 隊列 Queue: 隊列,是 Rabbi tMQ 的內部對象,用於存儲消息。

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

RabbitMQ 中的 交換器有四種類型 , 四種類型分別是 fanout 、 direct 、 topic 、headers ,不同的類型有著不 同的路由策略。 5.3.2 路由鍵 RoutingKey : 路由鍵 。 生產者將消息發給交換器 的時候, 一般會指定一個 RoutingKey,用來指定這個 消息的路由規則,而這個 RoutingKey 需要與交換器類型和綁定鍵 (BindingKey) 聯和使用才能最終生效。 在交換器類型和綁定鍵 (BindingKey) 固定的情況下,生產者可以在發送消息給交 換器時, 通過指定 RoutingKey 來決定消息流向哪裡。 5.3.3 綁定 Binding: 綁定。 RabbitMQ 中通過綁定將交換器與隊列關聯起來,在綁定的時候一 般會指定一個綁定鍵 (BindingKey) ,這樣 RabbitMQ 就知道如何正確地將消息路由到隊列了。 5.4 交換器類型 1).fanout :它會把所有發送到該交換器的消息路由到所有與該交換器綁定的隊列 中。 2).direct: 該 類 型 的 交 換 器 路 由 規 則 也 很 簡 單 , 它 會 把 消 息 路 由 到 那 些 BindingKey 和 RoutingKey 完全匹配的隊列中。 3).topic : 前面講到 direct 類型的交換器路由規則是完全匹配 BindingK eytopic 類型的交換器在匹配規則上進行了擴展,它與 direct 類型的交換器相似,也是將消息路由到 BindingKey 和 RoutingKey 相匹配的隊 列中,但這裡的匹配規則有些不同,它約定 :

RoutingKey 為 一 個 點 號 "." 分割的字符串 , 如 : com.itcast.client , com.itheima.exam 。 BindingKey 與 RoutingKey 一樣也是點號 "." 分割 的字符串。 BindingKey 中可 以 存在 兩 種 特殊 的 字符 串 "*" 和 "#" , 用 於 模糊 匹配 ,其中 "#" 用於匹配一個單詞 , "*" 用於匹配多個單個 (可以是零個 )。 4). headers : 該類型的交換器不依賴於路由鍵的匹配規則來路由消息,而是根據 發送的消息內容中的headers屬性進行匹配。 6 生產者發送消息 6.1 隊列綁定 6.1.1 創建隊列 在 RabbitMQ 的後臺管理界面中創建一個隊列 , 指定隊列名稱。

6.1.2 創建交換器 Exchange 在 RabbitMQ 的後臺管理界面中創建一個交換器,指定交換器的名 稱, 並且指定交換器類 型。

6.1.3 綁定隊列與交換器在交換器列表點擊對應的交換器,進入到綁定界面,指定隊列名稱 queue ,指定RoutingKey ,通過該 RoutingKey 來綁定該隊列與交換器 Exchange 。 之後,在發送消息時,指定了 Exchange,及 RoutingKey,就可以將該消息路由 到該隊列 queue 中。

6.2 發送消息邏輯代碼

6.2.1 引入依賴

<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.2.0</version> </dependency>

6.2.2 發送消息

@Testpublic void test1() throws Exception{//指定往哪一個交換器中發送消息String exchangeName = "itcast.v0.topic";//指定消息的路由RoutingKeyString routingKey = "itcast.item.add";//創建一個連接工廠 , 指定 主機,埠, 訪問的虛擬主機, 用戶名, 密碼ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("192.168.142.132");connectionFactory.setPort(5672); connectionFactory .setVirtualHost( "/" ); connectionFactory .setUsername( "admin" ); connectionFactory .setPassword( "admin" ); // 創建一個連結 Connection connection = connectionFactory .newConnection(); // 創建一個通道 Channel Channel channel = connection .createChannel(); // 調用 basicPublish 循環發送 50 條消息 , 每條消息之間 ,間隔 1秒 for (int i = 0; i < 50; i++) { channel .basicPublish( exchangeName , routingKey , MessageProperties. TEXT_PLAIN , ( "生產者生產的消息 083100" +i).getBytes()); TimeUnit. SECONDS .sleep(1); } }

6.3 發送消息平臺監測

7 消費者接受消息 7.1 引入依賴

<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.2.0</version></dependency>

7.2接收消息

@Testpublic void test1() throws Exception{//指定隊列名稱String queueName = "itcast_item_add_queue";//獲取連接工廠 , 指定主機 , 埠, 虛擬主機 , 用戶名 , 密碼ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("192.168.142.132");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");connectionFactory.setUsername("admin");connectionFactory.setPassword("admin");//創建連接Connection connection = connectionFactory.newConnection();//創建通道ChannelChannel channel = connection.createChannel();//設置客戶端最多接收未被ack的消息的個數channel.basicQos(10);//構造消息者, 進行消息的消費Consumer consumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,BasicProperties properties, byte[] body) throws IOException {System.out.println("consumerTag : " + consumerTag);System.out.println("properties : " +JSON.toJSONString(properties));System.out.println("envelope : " + JSON.toJSONString(envelope));System.out.println("receive Message : " + new String(body) );System.out.println("----------------------------------------");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}//通過消息已經接受到channel.basicAck(envelope.getDeliveryTag(), false);}};channel.basicConsume(queueName, consumer);System.in.read();//讓程序等待在這裡, 一直監聽該消息隊列channel.close();connection.close();}

7.3 結果輸出

其中: consumerTag : 消息消費者的標籤 properties : 消息內容的頭信息數據 envelope : 消息體的數據包 ,其中包含消息發送時指定的 exchange, routingKey 等信息 .

相關焦點

  • 消息隊列:Rabbitmq如何保證不丟消息
    基礎知識:在開始探討這個問題之前,筆者還是覺得很有必要將rabbitmq的架構等基礎知識回顧下,如下所示:對於使用rabbitmq的服務來說,主要由三部分構成,它們分別是:生產者,rabbitmq,消費者。
  • 在K8S上部署rabbitmq集群-有狀態服務
    但是本文並不是一篇rabbitmq入門文章,閱讀需要有一定基礎。一、RabbitMQ簡介以熟悉的電商場景為例,如果商品服務和訂單服務是兩個不同的微服務,在下單的過程中訂單服務需要調用商品服務進行扣庫存操作。
  • 詳解SpringCloud中RabbitMQ消息隊列原理及配置,一篇就夠!
    所以rabbitmq的依賴可以在spring cloud中直接使用。# rabbitmq安裝位置spring.rabbitmq.host=localhost# rabbitmq的埠spring.rabbitmq.port=5672# rabbitmq的用戶名spring.rabbitmq.username=test
  • CTF入門指南 | 內附教程分享
    :都要學的內容:Windows基礎、Linux基礎、計算機組成原理、作業系統原理、網絡協議分析A方向:IDA工具使用(fs插件)、逆向工程、密碼學、緩衝區溢出等B方向:Web安全、網絡安全、內網滲透、資料庫安全等 前10的安全漏洞推薦書:A方向:RE for Beginners
  • 機器學習漫遊指南 最完整的入門書單(外文版)
    在雷鋒網所篩選的學習資源中,這堪稱是迄今為止最全面、最完整、權威性比較高的一份 ML 書單,涵蓋了最值得學習者、從業者、開發者認真研讀的精品書目。這份指南適合多樣背景的讀者:從想要了解機器學習的普通人,到入門新手,再到高階開發者和學術研究人員。因此,雷鋒網對其進行編譯整理,特來與大家分享。
  • 為期 1 周的 ML 入門指南
    然而,在我學習機器學習的基本知識一周後,發現入門比我想像的容易。本文旨在給予那些對機器學習有興趣的人一些入門指南,這個指南來自我為期一周的學習經驗。背景在我開始這一周的機器學習之前,我已經閱讀過一些相關的文章了, 並且學習了一半吳恩達(Andrew Ng)在 Coursera 上的機器學習課程,以及一些其他的理論課程。
  • 中文版Google App Engine入門指南(1)
    【IT168 資訊】本指南將介紹如何開發以及展示一個簡單的Google App Engine項目。這個示例項目-一個用戶留言簿-將會向你展示如何使用Google App Engine的多項服務,包括資料庫服務和谷歌帳戶服務。
  • 除了HAProxy,RabbitMQ集群還可以這樣用
    同樣的道理,訪問rabbitmq集群,除了常見的代理中間件,也可採用客戶端代理實現。客戶端代理支持多個地址通常,初始化ConnectionFactory只能接受一個地址。try { sentMsg(exchange, message); } catch (Exception ex) { connnect(); }}到此為止,驗證了通過客戶端代理模式訪問rabbitmq
  • 常見Rabbitmq面試題及答案總結
    3、 使用rabbitmq的場景(1) 服務間異步通信(2) 順序消費(3) 定時任務(4) 流量削峰(5) 解耦(為面向服務的架構(SOA)提供基本的最終一致性實現使用topic交換器時,可 以使用通配符9、 如何確保消息不丟失?
  • 烘焙小白入門之烤箱使用指南
    烘焙入門者剛剛開始了解烘焙時,對於烤箱的選擇和使用有著很多疑問。 所以這次小編收集整理了一些對於烘焙入門者來說較為實用的烤箱知識。
  • Github 首選數據科學入門指南
    > 來源:開源最前線(ID:OpenSourceTop) 最近,在 Github 上發現了一份數據科學的「入門套路
  • rabbitmq隊列之發送消息到指定隊列
    這裡是你的朝花夕拾、樂於分享動漫、生活小竅門、java程序小工具等給大家今天來分享一個:寫入消息到rabbitmq的java開發小工具類。
  • 突破移動營銷瓶頸,AppsFlyer發布業界權威《移動歸因入門指南》
    北京2019年5月9日 /美通社/ -- 全球領先的移動歸因與營銷分析公司AppsFlyer正式發布中文版本《移動歸因入門指南》。該指南堪稱移動領域市場營銷的工作手冊,全面且詳細地介紹了移動歸因工作流程及高效營銷策略。
  • GitHub開源中文版《Go入門指南》學習教程
    比如Python作為膠水語言,上手快、使用簡單、三方庫資源豐富,機器學習的一些模型算法包,深度學習Tensorflow、Pytorch都是用Python來做主要語言。Go語言現在越來越火了,各大廠逐漸開始使用Go語言,為啥呢?
  • LaTeX極簡入門指南
    本文面向日常電腦使用的大學生介紹最快入門LaTeX的方法,如需知道LaTeX有什麼用?好在哪裡? 請在知乎檢索LaTeX或查閱lshort-zh-cn(見下文)1.1概述。本文內容實際操作時間約3-4小時,其中約2.5小時用於安裝軟體,餘下時間用於第一次嘗試學習寫LaTeX文檔。
  • Markdown與LaTeX公式的使用入門指南
    它允許人們使用易讀易寫的純文本格式編寫文檔,然後轉換成有效的XHTML(或者HTML)文檔。這種語言吸收了很多在電子郵件中已有的純文本標記的特性。由於Markdown的輕量化、易讀易寫特性,並且對於圖片,圖表、數學式都有支持,目前許多網站都廣泛使用Markdown來撰寫幫助文檔或是用於論壇上發表消息。
  • 針對 Quant 的 Python 快速入門指南
    作者:用Python的交易員最近有越來越多的朋友在知乎或者QQ上問我如何學習入門Python,就目前需求來看,我需要寫這麼一篇指南
  • 攝影初哥好選擇 入門單眼相機選購指南
    對於攝影初哥來說,畫質出眾、操控專業、價格低廉的入門級單反是最為合適的入門攝影器材。 雖然目前微單相機勢頭正猛,但是在對焦、續航、操控以及鏡頭資源上,單眼相機還是有著不小的優勢。攝影包和存儲卡是推薦購買的,三腳架可以按需購買,其實大多數攝影初學者對於三腳架的使用並不頻繁。攝影包別光看牌子,主要看防護能力和背負的舒適度,性價比很重要。如果您現有的包就可以裝下單反,並且不會造成使用上的不便,攝影包也就沒必要單獨購買了。
  • 格拉斯哥卡利多尼安大學快速入門指南簡介
    下面南昌留學雲小編為大家介紹格拉斯哥卡利多尼安大學快速入門指南簡介!拉斯哥卡利多尼安大學快速入門指南之申請流程1.確定申請專業2.準備所有申請材料,如個人陳述、簡歷、推薦信、學歷證明等3.提交申請材料和在線網申4.順利的拿到學校offer
  • 一種RabbitMQ網絡分區問題的解決方案
    另外當節點網絡異常時,調用RabbitMQ的相關API會超時,導致判斷異常,因此通過Keepalived的形式,給rabbitmq集群的檢測恢復服務做了一個主備,當網絡異常時可以自動切換到備節點上面繼續檢測集群服務。