天天看點

rabbitmq-01 rabbitmq概念介紹1.RabbitMQ簡介2.幾種常見消息中間件3.RabbitMQ環境安裝4.RabbitMQ管理平台5.RabbitMQ關鍵名詞

1.RabbitMQ簡介

RabbitMQ是一個由erlang開發的AMQP(Advanced Message Queue )的開源實作。AMQP 的出現其實也是應了廣大人民群衆的需求,雖然在同步消息通訊的世界裡有很多公開标準(如 COBAR的 IIOP ,或者是 SOAP 等),但是在異步消息進行中卻不是這樣,隻有大企業有一些商業實作(如微軟的 MSMQ ,IBM 的 Websphere MQ 等),是以,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等聯合制定了 AMQP 的公開标準。

RabbitMQ是由RabbitMQ Technologies Ltd開發并且提供商業支援的。該公司在2010年4月被SpringSource(VMWare的一個部門)收購。在2013年5月被并入Pivotal。其實VMWare,Pivotal和EMC本質上是一家的。不同的是VMWare是獨立上市子公司,而Pivotal是整合了EMC的某些資源,現在并沒有上市。

注意:RabbitMQ是采用erlang語言開發的,是以必須有erlang環境才可以運作

1.1 erlang語言簡介

Erlang程式設計語言最初目的是進行大型電信交換裝置的軟體開發,是一種适用于大規模并行處理環境的高可靠性程式設計語言。随着多核處理器技術的日漸普及,以及網際網路、雲計算等技術的發展,該語言的應用範圍也有逐漸擴大之勢。

初衷理念實作抗高并發語言

2.幾種常見消息中間件

rabbitmq-01 rabbitmq概念介紹1.RabbitMQ簡介2.幾種常見消息中間件3.RabbitMQ環境安裝4.RabbitMQ管理平台5.RabbitMQ關鍵名詞

3.RabbitMQ環境安裝

3.1 windows下安裝

  • 下載下傳并安裝erlang,下載下傳位址:http://www.erlang.org/download
  • 配置erlang環境變量資訊
    • 新增環境變量ERLANG_HOME=erlang的安裝位址
    • 将%ERLANG_HOME%\bin加入到path中
  • 下載下傳并安裝RabbitMQ,下載下傳位址:http://www.rabbitmq.com/download.html

注意: RabbitMQ 它依賴于Erlang,需要先安裝Erlang。

3.2 docker安裝

  • 拉取鏡像
docker pull rabbitmq:3-management
           
  • 啟動鏡像(預設使用者名密碼),預設guest 使用者,密碼也是 guest
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
           
  • 啟動鏡像(設定使用者名密碼)
docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:3-management
           

4.RabbitMQ管理平台

  • RabbitMQ 管理平台位址:http://127.0.0.1:15672
  • 預設賬号:guest/guest

    使用者可以自己建立新的賬号

4.1 Virtual Hosts

像mysql有資料庫的概念并且可以指定使用者對庫和表等操作的權限。那RabbitMQ呢?RabbitMQ也有類似的權限管理。在RabbitMQ中可以虛拟消息伺服器VirtualHost,每個VirtualHost相當月一個相對獨立的RabbitMQ伺服器,每個VirtualHost之間是互相隔離的。exchange、queue、message不能互通。

rabbitmq-01 rabbitmq概念介紹1.RabbitMQ簡介2.幾種常見消息中間件3.RabbitMQ環境安裝4.RabbitMQ管理平台5.RabbitMQ關鍵名詞
rabbitmq-01 rabbitmq概念介紹1.RabbitMQ簡介2.幾種常見消息中間件3.RabbitMQ環境安裝4.RabbitMQ管理平台5.RabbitMQ關鍵名詞

5.RabbitMQ關鍵名詞

AMQP(進階消息隊列協定)是一個異步消息傳遞所使用應用層協定規範,為面向消息中間件設計,基于此協定的用戶端與消息中間件可以無視消息來源傳遞消息,不受用戶端、消息中間件、不同的開發語言環境等條件的限制;

涉及概念解釋:

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

5.1 RabbitMQ交換機的作用

rabbitmq-01 rabbitmq概念介紹1.RabbitMQ簡介2.幾種常見消息中間件3.RabbitMQ環境安裝4.RabbitMQ管理平台5.RabbitMQ關鍵名詞

生産者發送消息不會向傳統方式直接将消息投遞到隊列中,而是先将消息投遞到交換機中,在由交換機轉發到具體的隊列,隊列在将消息以推送或者拉取方式給消費者進行消費,這和我們之前學習Nginx有點類似。

交換機的作用根據具體的路由政策分發到不同的隊列中,交換機有四種類型。

  • Direct exchange(直連交換機)是根據消息攜帶的路由鍵(routing key)将消息投遞給對應隊列的
  • Fanout exchange(扇型交換機)将消息路由給綁定到它身上的所有隊列
  • Topic exchange(主題交換機)隊列通過路由鍵綁定到交換機上,然後,交換機根據消息裡的路由值,将消息路由給一個或多個綁定隊列
  • Headers exchange(頭交換機)類似主題交換機,但是頭交換機使用多個消息屬性來代替路由鍵建立路由規則。通過判斷消息頭的值能否與指定的綁定相比對來确立路由規則。 (很少使用)

5.2 消息隊列RabbitMQ應答模式

為了確定消息不會丢失,RabbitMQ支援消息應答。消費者發送一個消息應答,告訴RabbitMQ這個消息已經接收并且處理完畢了。RabbitMQ就可以删除它了。

如果一個消費者挂掉卻沒有發送應答,RabbitMQ會了解為這個消息沒有處理完全,然後交給另一個消費者去重新處理。這樣,你就可以确認即使消費者偶爾挂掉也不會丢失任何消息了。

沒有任何消息逾時限制;隻有當消費者挂掉時,RabbitMQ才會重新投遞。即使處理一條消息會花費很長的時間。

消息應答是預設打開的。我們通過顯示的設定autoAsk=true關閉這種機制。現即自動應答開,一旦我們完成任務,消費者會自動發送應答。通知RabbitMQ消息已被處理,可以從記憶體删除。如果消費者因當機或連結失敗等原因沒有發送ACK(不同于ActiveMQ,在RabbitMQ裡,消息沒有過期的概念),則RabbitMQ會将消息重新發送給其他監聽在隊列的下一個消費者。

5.2.1 案例

生産者端代碼不變,消費者端代碼這部分就是用于開啟手動應答模式的。

channel.basicConsume(QUEUE_NAME, false, defaultConsumer);
           

注:第二個參數值為false代表關閉RabbitMQ的自動應答機制,改為手動應答。

在處理完消息時,傳回應答狀态,true表示為自動應答模式。

channel.basicAck(envelope.getDeliveryTag(), false);
           

5.3 RabbitMQ的公平轉發

目前消息轉發機制是平均配置設定,這樣就會出現倆個消費者,奇數的任務很耗時,偶數的任何工作量很小,造成的原因就是近當消息到達隊列進行轉發消息。并不在乎有多少任務消費者并未傳遞一個應答給RabbitMQ。僅僅盲目轉發所有的奇數給一個消費者,偶數給另一個消費者。

為了解決這樣的問題,我們可以使用basicQos方法,傳遞參數為prefetchCount= 1。這樣告訴RabbitMQ不要在同一時間給一個消費者超過一條消息。

換句話說,隻有在消費者空閑的時候會發送下一條資訊。排程分發消息的方式,也就是告訴RabbitMQ每次隻給消費者處理一條消息,也就是等待消費者處理完畢并自己對剛剛處理的消息進行确認之後,才發送下一條消息,防止消費者太過于忙碌,也防止它太過去清閑。

通過設定channel.basicQos(1);

rabbitmq-01 rabbitmq概念介紹1.RabbitMQ簡介2.幾種常見消息中間件3.RabbitMQ環境安裝4.RabbitMQ管理平台5.RabbitMQ關鍵名詞

5.4 RabbitMQ消息确認機制

生産者發送消息出去之後,不知道到底有沒有發送到RabbitMQ伺服器, 預設是不知道的。而且有的時候我們在發送消息之後,後面的邏輯出問題了,我們不想要發送之前的消息了,需要撤回該怎麼做。

5.4.1 解決方案

  • AMQP 事務機制
  • Confirm 模式

5.4.2 事務模式

  • txSelect 将目前channel設定為transaction模式
  • txCommit 送出目前事務
  • txRollback 事務復原

5.4.2.1 代碼實作

  • AmqpProducer

5.4.3 Confirm 模式

  • ConfirmProducer