在Windows上安裝RabbitMQ指南

rabbitMQ是一個在AMQP協議標準基礎上完整的,可服用的企業消息系統。他遵循Mozilla Public License開源協議。采用 Erlang 實現的工業級的消息隊列(MQ)服務器。

長興網站建設公司創新互聯公司,長興網站設計制作,有大型網站制作公司豐富經驗。已為長興數千家提供企業網站建設服務。企業網站搭建\成都外貿網站建設公司要多少錢,請找那個售后服務好的長興做網站的公司定做!

AMQP(高級消息隊列協議) 是一個異步消息傳遞所使用的應用層協議規范,作為線路層協議,而不是API(例如JMS),AMQP 客戶端能夠無視消息的來源任意發送和接受信息。AMQP的原始用途只是為金融界提供一個可以彼此協作的消息協議,而現在的目標則是為通用消息隊列架構提供通用構建工具。因此,面向消息的中間件 (MOM)系統,例如發布/訂閱隊列,沒有作為基本元素實現。反而通過發送簡化的AMQ實體,用戶被賦予了構建例如這些實體的能力。這些實體也是規范的一 部分,形成了在線路層協議頂端的一個層級:AMQP模型。這個模型統一了消息模式,諸如之前提到的發布/訂閱,隊列,事務以及流數據,并且添加了額外的特性,例如更易于擴展,基于內容的路由。

AMQP當中有四個概念非常重要

virtual host,虛擬主機 exchange,交換機 queue,隊列 binding,綁定

一個虛擬主機持有一組交換機、隊列和綁定。

為什么需要多個虛擬主機呢?因為RabbitMQ當中,用戶只能在虛擬主機的粒度進行權限控制。因此,如果需要禁止A組訪問B組的交換機/隊列/綁定,必須為A和B分別創建一個虛擬主機。每一個RabbitMQ服務器都有一個默認的虛擬主機/。

何謂虛擬主機(virtual host),交換機(exchange),隊列(queue)和綁定(binding)

隊列(Queues)是你的消息(messages)的終點,可以理解成裝消息的容器。消息就一直在里面,直到有客戶端(也就是消費者,Consumer)連接到這個隊列并且將其取走為止。不過,也可以將一個隊列配置成這樣的:一旦消息進入這個隊列,此消息就被刪除。

隊列是由消費者(Consumer)通過程序建立的,不是通過配置文件或者命令行工具。這沒什么問題,如果一個消費者試圖創建一個已經存在的隊列,RabbitMQ會直接忽略這個請求。因此我們可以將消息隊列的配置寫在應用程序的代碼里面。

而要把一個消息放進隊列前,需要有一個交換機(Exchange)。

交換機(Exchange)可以理解成具有路由表的路由程序。每個消息都有一個稱為路由鍵(routing key)的屬性,就是一個簡單的字符串。交換機當中有一系列的綁定(binding),即路由規則(routes)。(例如,指明具有路由鍵 “X” 的消息要到名為timbuku的隊列當中去。)

消費者程序(Consumer)要負責創建你的交換機。交換機可以存在多個,每個交換機在自己獨立的進程當中執行,因此增加多個交換機就是增加多個進程,可以充分利用服務器上的CPU核以便達到更高的效率。例如,在一個8核的服務器上,可以創建5個交換機來用5個核,另外3個核留下來做消息處理。類似的,在RabbitMQ的集群當中,你可以用類似的思路來擴展交換機一邊獲取更高的吞吐量。

交換機如何判斷要把消息送到哪個隊列?你需要路由規則,即綁定(binding)。一個綁定就是一個類似這樣的規則:將交換機“desert(沙漠)”當中具有路由鍵“阿里巴巴”的消息送到隊列“hideout(山洞)”里面去。換句話說,一個綁定就是一個基于路由鍵將交換機和隊列連接起來的路由規則。例如,具有路由鍵“audit”的消息需要被送到兩個隊列,“log-forever”和“alert-the-big-dude”。要做到這個,就需要創建兩個綁定,每個都連接一個交換機和一個隊列,兩者都是由“audit”路由鍵觸發。在這種情況下,交換機會復制一份消息并且把它們分別發送到兩個隊列當中。交換機不過就是一個由綁定構成的路由表。

交換機有多種類型。他們都是做路由的,但是它們接受不同類型的綁定。為什么不創建一種交換機來處理所有類型的路由規則呢?因為每種規則用來做匹配分子的CPU開銷是不同的。例如,一個“topic”類型的交換機試圖將消息的路由鍵與類似“dogs.*”的模式進行匹配。匹配這種末端的通配符比直接將路由鍵與“dogs”比較(“direct”類型的交換機)要消耗更多的CPU。如果你不需要“topic”類型的交換機帶來的靈活性,你可以通過使用“direct”類型的交換機獲取更高的處理效率。那么有哪些類型,他們又是怎么處理的呢?

Exchange

Exchange Direct

Exchange Fanout

Exchange Topic


持久化

你花了大量的時間來創建隊列、交換機和綁定,然后,服務器程序掛了。你的隊列、交換機和綁定怎么樣了?還有,放在隊列里面但是尚未處理的消息們呢?

如果你是用默認參數構造的這一切的話,那么,他們都灰飛煙滅了。RabbitMQ重啟之后會干凈的像個新生兒。你必須重做所有的一切,亡羊補牢,如何避免將來再度發生此類杯具?

隊列和交換機有一個創建時候指定的標志durable。durable的唯一含義就是具有這個標志的隊列和交換機會在重啟之后重新建立,它不表示說在隊列當中的消息會在重啟后恢復。那么如何才能做到不只是隊列和交換機,還有消息都是持久的呢?

但是首先需要考慮的問題是:是否真的需要消息的持久化?如果需要重啟后消息可以回復,那么它需要被寫入磁盤。但即使是最簡單的磁盤操作也是要消耗時間的。所以需要衡量判斷。

當你將消息發布到交換機的時候,可以指定一個標志“Delivery Mode”(投遞模式)。根據你使用的AMQP的庫不同,指定這個標志的方法可能不太一樣。簡單的說,就是將Delivery Mode設置成2,也就是持久的(persistent)即可。一般的AMQP庫都是將Delivery Mode設置成1,也就是非持久的。所以要持久化消息的步驟如下:

將交換機設成 durable。 將隊列設成 durable。 將消息的 Delivery Mode 設置成2 。

綁定(Bindings)怎么辦?綁定無法在創建的時候設置成durable。沒問題,如果你綁定了一個durable的隊列和一個durable的交換機,RabbitMQ會自動保留這個綁定。類似的,如果刪除了某個隊列或交換機(無論是不是durable),依賴它的綁定都會自動刪除。

注意:

RabbitMQ 不允許你綁定一個非堅固(non-durable)的交換機和一個durable的隊列。反之亦然。要想成功必須隊列和交換機都是durable的。 一旦創建了隊列和交換機,就不能修改其標志了。例如,如果創建了一個non-durable的隊列,然后想把它改變成durable的,唯一的辦法就是刪除這個隊列然后重現創建。因此,最好仔細檢查創建的標志。

安裝Rabbit MQ

Rabbit MQ 是建立在強大的Erlang OTP平臺上,因此安裝Rabbit MQ的前提是安裝Erlang。通過下面兩個連接下載安裝3.2.3 版本:

下載并安裝Eralng OTP For Windows(vR16B03) 運行安裝Rabbit MQ Server Windows Installer(v3.2.3)

默認安裝的Rabbit MQ 監聽端口是5672

激活Rabbit MQ\'s Management Plugin

使用Rabbit MQ 管理插件,可以更好的可視化方式查看Rabbit MQ 服務器實例的狀態,你可以在命令行中使用下面的命令激活:

"C:Program Files (x86)RabbitMQ Serverrabbitmq_server-3.2.3sbinrabbitmq-plugins.bat" enable rabbitmq_management

要重啟服務才能生效,可以執行

net stop RabbitMQ && net start RabbitMQ

下面我們使用rabbitmqctl控制臺命令(位于C:Program Files (x86)RabbitMQ Serverrabbitmq_server-3.2.3sbin>)來創建用戶,密碼,綁定權限等。

Microsoft Windows [版本 6.3.9600]
(c) 2013 Microsoft Corporation。保留所有權利。

c:Program Files (x86)RabbitMQ Serverrabbitmq_server-3.2.3sbin 的目錄

2014/11/01 15:04 <DIR> .
2014/11/01 15:04 <DIR> ..
2014/01/23 22:57 817 rabbitmq-echopid.bat
2014/01/23 22:57 1,900 rabbitmq-plugins.bat
2014/01/23 22:57 4,356 rabbitmq-server.bat
2014/01/23 22:57 7,123 rabbitmq-service.bat
2014/01/23 22:57 1,621 rabbitmqctl.bat
5 個文件 15,817 字節
2 個目錄 96,078,618,624 可用字節

c:Program Files (x86)RabbitMQ Serverrabbitmq_server-3.2.3sbin>rabbitmqctl.ba
t list_users
Listing users ...
guest [administrator]
...done.

c:Program Files (x86)RabbitMQ Serverrabbitmq_server-3.2.3sbin>rabbitmqctl.ba
t list_vhosts
Listing vhosts ...
/
...done.

c:Program Files (x86)RabbitMQ Serverrabbitmq_server-3.2.3sbin>rabbitmqctl.ba
t add_user geffzhang zsy@2014
Creating user "geffzhang" ...
...done.

c:Program Files (x86)RabbitMQ Serverrabbitmq_server-3.2.3sbin>rabbitmqctl.ba
t list_users
Listing users ...
geffzhang []
guest [administrator]
...done.

c:Program Files (x86)RabbitMQ Serverrabbitmq_server-3.2.3sbin>rabbitmqctl.ba
t set_user_tags geffzhang administrator
Setting tags for user "geffzhang" to [administrator] ...
...done.

c:Program Files (x86)RabbitMQ Serverrabbitmq_server-3.2.3sbin>rabbitmqctl.ba
t set_permissions -p / geffzhang ".*" ".*" ".*"
Setting permissions for user "geffzhang" in vhost "/" ...
...done.

c:Program Files (x86)RabbitMQ Serverrabbitmq_server-3.2.3sbin>rabbitmqctl.ba
t list_users
Listing users ...
geffzhang [administrator]
guest [administrator]
...done.

在.NET上使用Rabbit MQ

通過Nuget 獲取Rabbit MQNET client bindings from NuGet:

PM> Install-Package RabbitMQ.Client

我們最常見的一個場景是發送和接收Rabbit MQ 持久化消息:

第一步是聲明durable Exchange 和 Queue

private readonly ConnectionFactory rabbitMqFactory = new ConnectionFactory { HostName = "Geffzhang-NB", UserName="geffzhang", Password ="zsy@2014 ", VirtualHost ="/" };
conststringExchangeName="test.exchange";
conststringQueueName="test.queue";

using(IConnectionconn=rabbitMqFactory.CreateConnection())
using(IModelchannel=conn.CreateModel())
{
channel.ExchangeDeclare(ExchangeName,"direct",durable:true,autoDelete:false,arguments:null);

channel.QueueDeclare(QueueName,durable:true,exclusive:false,autoDelete:false,arguments:null);
channel.QueueBind(QueueName,ExchangeName,routingKey:QueueName);
}

下面對上面代碼進行說明:
1. 使用ConnectionFactory創建連接,雖然創建時指定了多個server address,但每個connection只與一個物理的server進行連接。

2. 定義交換方式,創建了Direct Exchange和Durable Queue,并使用QueueName作為routing key,可以把消息直接投遞到某個隊列。rabbitmq交換方式分為三種,分別是:
Direct Exchange– 處理路由鍵。需要將一個隊列綁定到交換機上,要求該消息與一個特定的路由鍵完全匹配。這是一個完整的匹配。如果一個隊列綁定到該交換機上要求路由鍵 “dog”,則只有被標記為“dog”的消息才被轉發,不會轉發dog.puppy,也不會轉發dog.guard,只會轉發dog。
Fanout Exchange– 不處理路由鍵。你只需要簡單的將隊列綁定到交換機上。一個發送到交換機的消息都會被轉發到與該交換機綁定的所有隊列上。很像子網廣播,每臺子網內的主機都獲得了一份復制的消息。Fanout交換機轉發消息是最快的。
Topic Exchange– 將路由鍵和某模式進行匹配。此時隊列需要綁定要一個模式上。符號“#”匹配一個或多個詞,符號“*”匹配不多不少一個詞。因此“audit.#”能夠匹配到“audit.irs.corporate”,但是“audit.*” 只會匹配到“audit.irs”。

運行上述代碼,可以在Rabbit MQ的管理控制臺上看到test.exchangeExchange 綁定到 創建的隊列test.queue

第二步就是發布持久化消息到隊列

Exchange和Queue建立好以后,就可以發送消息到隊列了。RabbitMq 可以接受byte[]的數據,字符串采用utf-8編碼的字節數組。確保消息可持久化的,需要設置PersistMode為true,參看下面的代碼:

varprops=channel.CreateBasicProperties();
props.SetPersistent(true);

varmsgBody=Encoding.UTF8.GetBytes("Hello, World!");
channel.BasicPublish(ExchangeName,routingKey:QueueName,basicProperties:props,body:msgBody);
第三步就是消費消息了,有幾種不同的方法從隊列中消費消息,最常見的是使用BasicGet:

BasicGetResult msgResponse = channel.BasicGet(QueueName, noAck: true);

var msgBody = Encoding.UTF8.GetString(msgResponse.Body);

NoAck:true告訴RabbitMQ立即從隊列中刪除消息,另一個非常受歡迎的方式是從隊列中刪除已經確認接收的消息,可以通過單獨調用BasicAck 進行確認:

BasicGetResultmsgResponse=channel.BasicGet(QueueName,noAck:false);

//process message ...

channel.BasicAck(msgResponse.DeliveryTag,multiple:false);
使用BasicAck方式來告之是否從隊列中移除該條消息,這一點很重要,因為在某些應用場景下,比如從隊列中獲取消息并用它來操作數據庫或日志文件時,如果出現操作失敗時,則該條消息應該保留在隊列中,只到操作成功時才從隊列中移除。

另一種方法是通過基于推送的事件訂閱。您可以使用內置的QueueingBasicConsumer提供簡化的編程模型,通過允許您在共享隊列上阻塞,直到收到一條消息,例如

var consumer = new QueueingBasicConsumer(channel);

channel.BasicConsume(QueueName, noAck: true, consumer: consumer);

var msgResponse = consumer.Queue.Dequeue(); //blocking

var msgBody = Encoding.UTF8.GetString(msgResponse.Body);

分享題目:在Windows上安裝RabbitMQ指南
當前路徑:http://m.kartarina.com/article26/cpcijg.html

成都網站建設公司_創新互聯,為您提供云服務器全網營銷推廣網站設計定制開發虛擬主機網站制作

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

手機網站建設
主站蜘蛛池模板: 永久免费av无码网站韩国毛片| 一本色道无码不卡在线观看| 国产台湾无码AV片在线观看| 亚洲国产精品无码久久九九 | 久久久久久亚洲av无码蜜芽| 中日韩亚洲人成无码网站| 精品人妻中文无码AV在线| 久久久久无码精品国产不卡| YY111111少妇无码理论片| 亚洲熟妇无码八V在线播放| 97无码人妻福利免费公开在线视频| 无码国产精品一区二区免费虚拟VR | 久久无码人妻一区二区三区午夜| 无码乱码观看精品久久| 无码国产精品久久一区免费| 亚洲不卡中文字幕无码| 成人A片产无码免费视频在线观看| av无码免费一区二区三区| 无码精品一区二区三区在线| 中文字幕无码久久久| 一本大道无码人妻精品专区| 亚洲AV无码无限在线观看不卡| 日韩精品少妇无码受不了| 亚洲精品无码午夜福利中文字幕 | 日韩欧精品无码视频无删节 | 久久亚洲AV无码精品色午夜麻豆| 国产精品无码DVD在线观看| 精品无码中文视频在线观看| 亚洲av片不卡无码久久| 无码国内精品人妻少妇蜜桃视频| 中文字幕无码av激情不卡久久 | 亚洲大尺度无码无码专区| 熟妇人妻系列aⅴ无码专区友真希| 69成人免费视频无码专区| 精品无码国产AV一区二区三区 | yy111111电影院少妇影院无码| 日韩人妻系列无码专区| 无码国产69精品久久久久孕妇| 国产成人无码A区精油按摩| 性无码专区一色吊丝中文字幕| 国产精品va无码免费麻豆|