国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
一 環(huán)境搭建
二 開(kāi)始使用
2.1 Hello World
2.2 工作隊(duì)列
2.3 消息響應(yīng)
2.4 消息持久化
2.5 公平分發(fā)
2.6 完整實(shí)例
三 管理界面
四 總結(jié)
五 參考文獻(xiàn)
首頁(yè) php教程 php手冊(cè) NET環(huán)境中使用RabbitMQ

NET環(huán)境中使用RabbitMQ

Jul 06, 2016 pm 01:30 PM
net rabbitmq 使用 搭建 環(huán)境 首先

一 環(huán)境搭建 首先,由于RabbitMQ使用Erlang編寫(xiě)的,需要運(yùn)行在Erlang運(yùn)行時(shí)環(huán)境上,所以在安裝RabbitMQ Server之前需要安裝Erlang 運(yùn)行時(shí)環(huán)境,可以到Erlang官網(wǎng)下載對(duì)應(yīng)平臺(tái)的安裝文件。如果沒(méi)有安裝運(yùn)行時(shí)環(huán)境,安裝RabbitMQ Server的時(shí)候,會(huì)提示需要先安

?

一 環(huán)境搭建

首先,由于RabbitMQ使用Erlang編寫(xiě)的,需要運(yùn)行在Erlang運(yùn)行時(shí)環(huán)境上,所以在安裝RabbitMQ Server之前需要安裝Erlang 運(yùn)行時(shí)環(huán)境,可以到Erlang官網(wǎng)下載對(duì)應(yīng)平臺(tái)的安裝文件。如果沒(méi)有安裝運(yùn)行時(shí)環(huán)境,安裝RabbitMQ Server的時(shí)候,會(huì)提示需要先安裝Erlang環(huán)境。 安裝完成之后,確保已經(jīng)將Erlang的安裝路徑注冊(cè)到系統(tǒng)的環(huán)境變量中。安裝完Erlang之后,這個(gè)環(huán)境會(huì)自動(dòng)設(shè)置,如果沒(méi)有:按照下圖進(jìn)行設(shè)置。

?

然后,去RabbitMQ官網(wǎng)下載RabbitMQ Server服務(wù)端程序,選擇合適的平臺(tái)版本下載。安裝完成之后,就可以開(kāi)始使用了。

現(xiàn)在就可以對(duì)RabbitMQ Server進(jìn)行配置了。

首先,切換到RabbitMQ Server的安裝目錄:

在sbin下面有很多batch文件,用來(lái)控制RabbitMQ Server。

最簡(jiǎn)單的方式是使RabbitMQ以Windows Service的方式在后臺(tái)運(yùn)行,所以我們需要以管理員權(quán)限打開(kāi)cmd,然后切換到sbin目錄下,執(zhí)行這三條命令即可:

rabbitmq-service install
rabbitmq-service enable
rabbitmq-service start

現(xiàn)在RabbitMQ的服務(wù)端已經(jīng)啟動(dòng)起來(lái)了(如果啟動(dòng)失敗,請(qǐng)檢查安裝后是否服務(wù)已經(jīng)啟動(dòng),如果沒(méi)有,則可能是因?yàn)榘惭b版本的原因)。

下面可以使用sbin目錄下面的rabbitmqctl.bat這個(gè)腳本來(lái)查看和控制服務(wù)端狀態(tài)的,在cmd中直接運(yùn)行rabbitmqctl status。如果不是看到以下結(jié)果:,需要到C:\Windows目錄下,將.erlang.cookie文件,拷貝到用戶(hù)目錄下 C:\Users\{用戶(hù)名},這是Erlang的Cookie文件,允許與Erlang進(jìn)行交互:

RabbitMQ Server上面也有用戶(hù)概念,安裝好之后,使用rabbitmqctl list_users命令,可以看到上面目前的用戶(hù):

可以使用下面的命令來(lái)添加用戶(hù)并設(shè)置權(quán)限:

rabbitmqctl  add_user  test  123456
rabbitmqctl  set_permissions  test  ".*"  ".*"  ".*"
rabbitmqctl  set_user_tags test administrator

上面的一條命令添加了一個(gè)名為test的用戶(hù),并設(shè)置了密碼123456,下面的命令為用戶(hù)test分別授予對(duì)所有消息隊(duì)列的配置、讀和寫(xiě)的權(quán)限。

現(xiàn)在我們可以將默認(rèn)的guest用戶(hù)刪掉,使用下面的命令即可:

rabbitmqctl delete_user guest

如果要修改密碼,可以使用下面的命令:

rabbitmqctl change_passWord {username}  {newpassowrd}

二 開(kāi)始使用

在.NET中使用RabbitMQ需要下載RabbitMQ的客戶(hù)端程序集,可以到官網(wǎng)下載,下載解壓后就可以得到RabbitMQ.Client.dll,這就是RabbitMQ的客戶(hù)端。

在使用RabitMQ之前,需要對(duì)下面的幾個(gè)基本概念說(shuō)明一下:

RabbitMQ是一個(gè)消息代理。他從消息生產(chǎn)者(PRoducers)那里接收消息,然后把消息送給消息消費(fèi)者(consumer)在發(fā)送和接受之間,他能夠根據(jù)設(shè)置的規(guī)則進(jìn)行路由,緩存和持久化。

一般提到RabbitMQ和消息,都用到一些專(zhuān)有名詞。

  • 生產(chǎn)(Producing)意思就是發(fā)送。發(fā)送消息的程序就是一個(gè)生產(chǎn)者(producer)。我們一般用"P"來(lái)表示:

producer

  • 隊(duì)列(queue)就是郵箱的名稱(chēng)。消息通過(guò)你的應(yīng)用程序和RabbitMQ進(jìn)行傳輸,它們只能存儲(chǔ)在隊(duì)列(queue)中。 隊(duì)列(queue)容量沒(méi)有限制,你要存儲(chǔ)多少消息都可以——基本上是一個(gè)無(wú)限的緩沖區(qū)。多個(gè)生產(chǎn)者(producers)能夠把消息發(fā)送給同一個(gè)隊(duì)列,同樣,多個(gè)消費(fèi)者(consumers)也能從同一個(gè)隊(duì)列(queue)中獲取數(shù)據(jù)。隊(duì)列可以畫(huà)成這樣(圖上是隊(duì)列的名稱(chēng)):

queue

  • 消費(fèi)(Consuming)和獲取消息是一樣的意思。一個(gè)消費(fèi)者(consumer)就是一個(gè)等待獲取消息的程序。我們把它畫(huà)作"C":

consumer

通常,消息生產(chǎn)者,消息消費(fèi)者和消息代理不在同一臺(tái)機(jī)器上。

2.1 Hello World

為了展示RabbitMQ的基本使用,我們發(fā)送一個(gè)HelloWorld消息,然后接收并處理。

rabbitmq hello world

首先創(chuàng)建一個(gè)控制臺(tái)程序,用來(lái)將消息發(fā)送到RabbitMQ的消息隊(duì)列中,代碼如下:


首先,需要?jiǎng)?chuàng)建一個(gè)ConnectionFactory,設(shè)置目標(biāo),由于是在本機(jī),所以設(shè)置為localhost,如果RabbitMQ不在本機(jī),只需要設(shè)置目標(biāo)機(jī)器的ip地址或者機(jī)器名稱(chēng)即可,然后設(shè)置前面創(chuàng)建的用戶(hù)名test和密碼123456。

緊接著要?jiǎng)?chuàng)建一個(gè)Channel,如果要發(fā)送消息,需要?jiǎng)?chuàng)建一個(gè)隊(duì)列,然后將消息發(fā)布到這個(gè)隊(duì)列中。在創(chuàng)建隊(duì)列的時(shí)候,只有RabbitMQ上該隊(duì)列不存在,才會(huì)去創(chuàng)建。消息是以二進(jìn)制數(shù)組的形式傳輸?shù)?,所以如果消息是?shí)體對(duì)象的話(huà),需要序列化和然后轉(zhuǎn)化為二進(jìn)制數(shù)組。

現(xiàn)在客戶(hù)端發(fā)送代碼已經(jīng)寫(xiě)好了,運(yùn)行之后,消息會(huì)發(fā)布到RabbitMQ的消息隊(duì)列中,現(xiàn)在需要編寫(xiě)服務(wù)端的代碼連接到RabbitMQ上去獲取這些消息。

同樣,創(chuàng)建一個(gè)名為Receive的服務(wù)端控制臺(tái)應(yīng)用程序,服務(wù)端代碼如下:


和發(fā)送一樣,首先需要定義連接,然后聲明消息隊(duì)列。要接收消息,需要定義一個(gè)Consume,然后從消息隊(duì)列中不斷Dequeue消息,然后處理。

現(xiàn)在發(fā)送端和接收端的代碼都寫(xiě)好了,運(yùn)行發(fā)送端,發(fā)送消息:

現(xiàn)在,名為hello的消息隊(duì)列中,發(fā)送了一條消息。這條消息存儲(chǔ)到了RabbitMQ的服務(wù)器上了。使用rabbitmqctl 的list_queues可以查看所有的消息隊(duì)列,以及里面的消息個(gè)數(shù),可以看到,目前Rabbitmq上只有一個(gè)消息隊(duì)列,里面只有一條消息:

rabbitmqctl list_queues
Listing queues ...
hello   1

現(xiàn)在運(yùn)行接收端程序:

可以看到,已經(jīng)接受到了客戶(hù)端發(fā)送的Hello World,現(xiàn)在再來(lái)看RabitMQ上的消息隊(duì)列信息:

rabbitmqctl list_queues
Listing queues ...
hello   0

可以看到,hello這個(gè)隊(duì)列中的消息隊(duì)列個(gè)數(shù)為0,這表示,當(dāng)接收端,接收到消息之后,RabbitMQ上就把這個(gè)消息刪掉了。

2.2 工作隊(duì)列

前面的例子展示了如何往一個(gè)指定的消息隊(duì)列中發(fā)送和收取消息。現(xiàn)在我們創(chuàng)建一個(gè)工作隊(duì)列(work queue)來(lái)將一些耗時(shí)的任務(wù)分發(fā)給多個(gè)工作者(workers):

rabbitmq-work queue

工作隊(duì)列(work queues, 又稱(chēng)任務(wù)隊(duì)列Task Queues)的主要思想是為了避免立即執(zhí)行并等待一些占用大量資源、時(shí)間的操作完成。而是把任務(wù)(Task)當(dāng)作消息發(fā)送到隊(duì)列中,稍后處理。一個(gè)運(yùn)行在后臺(tái)的工作者(worker)進(jìn)程就會(huì)取出任務(wù)然后處理。當(dāng)運(yùn)行多個(gè)工作者(workers)時(shí),任務(wù)會(huì)在它們之間共享。

這個(gè)在網(wǎng)絡(luò)應(yīng)用中非常有用,它可以在短暫的HTTP請(qǐng)求中處理一些復(fù)雜的任務(wù)。在一些實(shí)時(shí)性要求不太高的地方,我們可以處理完主要操作之后,以消息的方式來(lái)處理其他的不緊要的操作,比如寫(xiě)日志等等。

準(zhǔn)備

在第一部分,發(fā)送了一個(gè)包含“Hello World!”的字符串消息?,F(xiàn)在發(fā)送一些字符串,把這些字符串當(dāng)作復(fù)雜的任務(wù)。這里使用time.sleep()函數(shù)來(lái)模擬耗時(shí)的任務(wù)。在字符串中加上點(diǎn)號(hào)(.)來(lái)表示任務(wù)的復(fù)雜程度,一個(gè)點(diǎn)(.)將會(huì)耗時(shí)1秒鐘。比如"Hello..."就會(huì)耗時(shí)3秒鐘。

對(duì)之前示例的send.cs做些簡(jiǎn)單的調(diào)整,以便可以發(fā)送隨意的消息。這個(gè)程序會(huì)按照計(jì)劃發(fā)送任務(wù)到我們的工作隊(duì)列中。

static void Main(string[] args)
{
    var factory = new ConnectionFactory();
    factory.HostName = "localhost";
    factory.UserName = "test";
    factory.Password = "123456";

    using (var connection = factory.CreateConnection())
    {
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare("hello", false, false, false, null);
            string message = <strong>GetMessage(args);</strong>
          <strong>  var properties = channel.CreateBasicProperties();
            properties.DeliveryMode = 2;</strong>

            var body = Encoding.UTF8.GetBytes(message);
            channel.BasicPublish("", "hello", properties, body);
            Console.WriteLine(" set {0}", message);
        }
    }

    Console.ReadKey();
}

private static string GetMessage(string[] args)
{
    return ((args.Length > 0) ? string.Join(" ", args) : "Hello World!");
}

加粗部分是經(jīng)過(guò)修改過(guò)了的。

接著我們修改接收端,讓他根據(jù)消息中的逗點(diǎn)的個(gè)數(shù)來(lái)Sleep對(duì)應(yīng)的秒數(shù):

static void Main(string[] args)
{
    var factory = new ConnectionFactory();
    factory.HostName = "localhost";
    factory.UserName = "test";
    factory.Password = "123456";

    using (var connection = factory.CreateConnection())
    {
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare("hello", false, false, false, null);

            var consumer = new QueueingBasicConsumer(channel);
            channel.BasicConsume("hello", true, consumer);

            while (true)
            {
                var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

                var body = ea.Body;
                var message = Encoding.UTF8.GetString(body);

              <strong>  int dots = message.Split('.').Length - 1;
                Thread.Sleep(dots * 1000);</strong>
                        
                Console.WriteLine("Received {0}", message);
                Console.WriteLine("Done");
            }
        }
    }
}

輪詢(xún)分發(fā)

使用工作隊(duì)列的一個(gè)好處就是它能夠并行的處理隊(duì)列。如果堆積了很多任務(wù),我們只需要添加更多的工作者(workers)就可以了,擴(kuò)展很簡(jiǎn)單。

現(xiàn)在,我們先啟動(dòng)兩個(gè)接收端,等待接受消息,然后啟動(dòng)一個(gè)發(fā)送端開(kāi)始發(fā)送消息。

Send message queue

在cmd條件下,發(fā)送了5條消息,每條消息后面的逗點(diǎn)表示該消息需要執(zhí)行的時(shí)長(zhǎng),來(lái)模擬耗時(shí)的操作。

然后可以看到,兩個(gè)接收端依次接收到了發(fā)出的消息:

receive message queue

默認(rèn),RabbitMQ會(huì)將每個(gè)消息按照順序依次分發(fā)給下一個(gè)消費(fèi)者。所以每個(gè)消費(fèi)者接收到的消息個(gè)數(shù)大致是平均的。 這種消息分發(fā)的方式稱(chēng)之為輪詢(xún)(round-robin)。

2.3 消息響應(yīng)

當(dāng)處理一個(gè)比較耗時(shí)得任務(wù)的時(shí)候,也許想知道消費(fèi)者(consumers)是否運(yùn)行到一半就掛掉。在當(dāng)前的代碼中,當(dāng)RabbitMQ將消息發(fā)送給消費(fèi)者(consumers)之后,馬上就會(huì)將該消息從隊(duì)列中移除。此時(shí),如果把處理這個(gè)消息的工作者(worker)停掉,正在處理的這條消息就會(huì)丟失。同時(shí),所有發(fā)送到這個(gè)工作者的還沒(méi)有處理的消息都會(huì)丟失。

我們不想丟失任何任務(wù)消息。如果一個(gè)工作者(worker)掛掉了,我們希望該消息會(huì)重新發(fā)送給其他的工作者(worker)。

為了防止消息丟失,RabbitMQ提供了消息響應(yīng)(acknowledgments)機(jī)制。消費(fèi)者會(huì)通過(guò)一個(gè)ack(響應(yīng)),告訴RabbitMQ已經(jīng)收到并處理了某條消息,然后RabbitMQ才會(huì)釋放并刪除這條消息。

如果消費(fèi)者(consumer)掛掉了,沒(méi)有發(fā)送響應(yīng),RabbitMQ就會(huì)認(rèn)為消息沒(méi)有被完全處理,然后重新發(fā)送給其他消費(fèi)者(consumer)。這樣,即使工作者(workers)偶爾的掛掉,也不會(huì)丟失消息。

消息是沒(méi)有超時(shí)這個(gè)概念的;當(dāng)工作者與它斷開(kāi)連的時(shí)候,RabbitMQ會(huì)重新發(fā)送消息。這樣在處理一個(gè)耗時(shí)非常長(zhǎng)的消息任務(wù)的時(shí)候就不會(huì)出問(wèn)題了。

消息響應(yīng)默認(rèn)是開(kāi)啟的。在之前的例子中使用了no_ack=True標(biāo)識(shí)把它關(guān)閉。是時(shí)候移除這個(gè)標(biāo)識(shí)了,當(dāng)工作者(worker)完成了任務(wù),就發(fā)送一個(gè)響應(yīng)。

channel.BasicConsume("hello", <strong>false</strong>, consumer);

while (true)
{
    var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

    var body = ea.Body;
    var message = Encoding.UTF8.GetString(body);

    int dots = message.Split('.').Length - 1;
    Thread.Sleep(dots * 1000);

    Console.WriteLine("Received {0}", message);
    Console.WriteLine("Done");

    <strong>channel.BasicAck(ea.DeliveryTag, false);</strong>
}

現(xiàn)在,可以保證,即使正在處理消息的工作者被停掉,這些消息也不會(huì)丟失,所有沒(méi)有被應(yīng)答的消息會(huì)被重新發(fā)送給其他工作者.

一個(gè)很常見(jiàn)的錯(cuò)誤就是忘掉了BasicAck這個(gè)方法,這個(gè)錯(cuò)誤很常見(jiàn),但是后果很?chē)?yán)重. 當(dāng)客戶(hù)端退出時(shí),待處理的消息就會(huì)被重新分發(fā),但是RabitMQ會(huì)消耗越來(lái)越多的內(nèi)存,因?yàn)檫@些沒(méi)有被應(yīng)答的消息不能夠被釋放。調(diào)試這種case,可以使用rabbitmqct打印messages_unacknoledged字段。

rabbitmqctl list_queues name messages_ready messages_unacknowledged
Listing queues ...
hello    0       0
...done.

2.4 消息持久化

前面已經(jīng)搞定了即使消費(fèi)者down掉,任務(wù)也不會(huì)丟失,但是,如果RabbitMQ Server停掉了,那么這些消息還是會(huì)丟失。

當(dāng)RabbitMQ Server 關(guān)閉或者崩潰,那么里面存儲(chǔ)的隊(duì)列和消息默認(rèn)是不會(huì)保存下來(lái)的。如果要讓RabbitMQ保存住消息,需要在兩個(gè)地方同時(shí)設(shè)置:需要保證隊(duì)列和消息都是持久化的。

首先,要保證RabbitMQ不會(huì)丟失隊(duì)列,所以要做如下設(shè)置:

bool durable = true;
channel.QueueDeclare("hello", durable, false, false, null);

雖然在語(yǔ)法上是正確的,但是在目前階段是不正確的,因?yàn)槲覀冎耙呀?jīng)定義了一個(gè)非持久化的hello隊(duì)列。RabbitMQ不允許我們使用不同的參數(shù)重新定義一個(gè)已經(jīng)存在的同名隊(duì)列,如果這樣做就會(huì)報(bào)錯(cuò)。現(xiàn)在,定義另外一個(gè)不同名稱(chēng)的隊(duì)列:

bool durable = true;
channel.queueDeclare("task_queue", durable, false, false, null);

queueDeclare 這個(gè)改動(dòng)需要在發(fā)送端和接收端同時(shí)設(shè)置。

現(xiàn)在保證了task_queue這個(gè)消息隊(duì)列即使在RabbitMQ Server重啟之后,隊(duì)列也不會(huì)丟失。 然后需要保證消息也是持久化的, 這可以通過(guò)設(shè)置IBasicProperties.SetPersistent 為true來(lái)實(shí)現(xiàn):

var properties = channel.CreateBasicProperties();
properties.SetPersistent(true);

需要注意的是,將消息設(shè)置為持久化并不能完全保證消息不丟失。雖然他告訴RabbitMQ將消息保存到磁盤(pán)上,但是在RabbitMQ接收到消息和將其保存到磁盤(pán)上這之間仍然有一個(gè)小的時(shí)間窗口。 RabbitMQ 可能只是將消息保存到了緩存中,并沒(méi)有將其寫(xiě)入到磁盤(pán)上。持久化是不能夠一定保證的,但是對(duì)于一個(gè)簡(jiǎn)單任務(wù)隊(duì)列來(lái)說(shuō)已經(jīng)足夠。如果需要消息隊(duì)列持久化的強(qiáng)保證,可以使用publisher confirms

2.5 公平分發(fā)

你可能會(huì)注意到,消息的分發(fā)可能并沒(méi)有如我們想要的那樣公平分配。比如,對(duì)于兩個(gè)工作者。當(dāng)奇數(shù)個(gè)消息的任務(wù)比較重,但是偶數(shù)個(gè)消息任務(wù)比較輕時(shí),奇數(shù)個(gè)工作者始終處理忙碌狀態(tài),而偶數(shù)個(gè)工作者始終處理空閑狀態(tài)。但是RabbitMQ并不知道這些,他仍然會(huì)平均依次的分發(fā)消息。

為了改變這一狀態(tài),我們可以使用basicQos方法,設(shè)置perfetchCount=1 。這樣就告訴RabbitMQ 不要在同一時(shí)間給一個(gè)工作者發(fā)送多于1個(gè)的消息,或者換句話(huà)說(shuō)。在一個(gè)工作者還在處理消息,并且沒(méi)有響應(yīng)消息之前,不要給他分發(fā)新的消息。相反,將這條新的消息發(fā)送給下一個(gè)不那么忙碌的工作者。

channel.BasicQos(0, 1, false); 

2.6 完整實(shí)例

現(xiàn)在將所有這些放在一起:

發(fā)送端代碼如下:

static void Main(string[] args)
{
    var factory = new ConnectionFactory();
    factory.HostName = "localhost";
    factory.UserName = "test";
    factory.Password = "123456";

    using (var connection = factory.CreateConnection())
    {
        using (var channel = connection.CreateModel())
        {
                   
            bool durable = true;
            channel.QueueDeclare("task_queue", durable, false, false, null);
                    
            string message = GetMessage(args);
            var properties = channel.CreateBasicProperties();
            properties.SetPersistent(true);
                  

            var body = Encoding.UTF8.GetBytes(message);
            channel.BasicPublish("", "task_queue", properties, body);
            Console.WriteLine(" set {0}", message);
        }
    }

    Console.ReadKey();
}

private static string GetMessage(string[] args)
{
    return ((args.Length > 0) ? string.Join(" ", args) : "Hello World!");
}

接收端代碼如下:

static void Main(string[] args)
{
    var factory = new ConnectionFactory();
    factory.HostName = "localhost";
    factory.UserName = "test";
    factory.Password = "123456";

    using (var connection = factory.CreateConnection())
    {
        using (var channel = connection.CreateModel())
        {
            bool durable = true;
            channel.QueueDeclare("task_queue", durable, false, false, null);
            channel.BasicQos(0, 1, false);

            var consumer = new QueueingBasicConsumer(channel);
            channel.BasicConsume("task_queue", false, consumer);

            while (true)
            {
                var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

                var body = ea.Body;
                var message = Encoding.UTF8.GetString(body);

                int dots = message.Split('.').Length - 1;
                Thread.Sleep(dots * 1000);

                Console.WriteLine("Received {0}", message);
                Console.WriteLine("Done");

                channel.BasicAck(ea.DeliveryTag, false);
            }
        }
    }
}

三 管理界面

RabbitMQ還有一個(gè)管理界面,通過(guò)該界面可以查看RabbitMQ Server 當(dāng)前的狀態(tài),該界面是以插件形式提供的,并且在安裝RabbitMQ的時(shí)候已經(jīng)自帶了該插件。需要做的是在RabbitMQ控制臺(tái)界面中啟用該插件,命令如下:

rabbitmq-plugins enable rabbitmq_management

rabbitmq management

現(xiàn)在,在瀏覽器中輸入 http://server-name:15672/ server-name換成機(jī)器地址或者域名,如果是本地的,直接用localhost在輸入之后,彈出登錄界面,使用我們之前創(chuàng)建的用戶(hù)登錄。

?.

在該界面上可以看到當(dāng)前RabbitMQServer的所有狀態(tài)。

四 總結(jié)

本文簡(jiǎn)單介紹了消息隊(duì)列的相關(guān)概念,并介紹了RabbitMQ消息代理的基本原理以及在Windows 上如何安裝RabbitMQ和在.NET中如何使用RabbitMQ。消息隊(duì)列在構(gòu)建分布式系統(tǒng)和提高系統(tǒng)的可擴(kuò)展性和響應(yīng)性方面有著很重要的作用,希望本文對(duì)您了解消息隊(duì)列以及如何使用RabbitMQ有所幫助。

五 參考文獻(xiàn)

  1. http://www.infoq.com/cn/articles/message-based-distributed-architecture
  2. http://www.rabbitmq.com/getstarted.html
  3. http://www.codethinked.com/using-rabbitmq-with-c-and-net
  4. http://www.infoq.com/cn/articles/AMQP-RabbitMQ
  5. http://www.infoq.com/cn/articles/ebay-scalability-best-practices

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線(xiàn)上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話(huà)題

foob??ar2000怎麼下載? -foobar2000怎麼使用 foob??ar2000怎麼下載? -foobar2000怎麼使用 Mar 18, 2024 am 10:58 AM

foob??ar2000是一款能隨時(shí)收聽(tīng)音樂(lè)資源的軟體,各種音樂(lè)無(wú)損音質(zhì)帶給你,增強(qiáng)版本的音樂(lè)播放器,讓你得到更全更舒適的音樂(lè)體驗(yàn),它的設(shè)計(jì)理念是將電腦端的高級(jí)音頻播放器移植到手機(jī)上,提供更便捷高效的音樂(lè)播放體驗(yàn),介面設(shè)計(jì)簡(jiǎn)潔明了易於使用它採(cǎi)用了極簡(jiǎn)的設(shè)計(jì)風(fēng)格,沒(méi)有過(guò)多的裝飾和繁瑣的操作能夠快速上手,同時(shí)還支持多種皮膚和主題,根據(jù)自己的喜好進(jìn)行個(gè)性化設(shè)置,打造專(zhuān)屬的音樂(lè)播放器支援多種音訊格式的播放,它還支援音訊增益功能根據(jù)自己的聽(tīng)力情況調(diào)整音量大小,避免過(guò)大的音量對(duì)聽(tīng)力造成損害。接下來(lái)就讓小編為大

crystaldiskmark是什麼軟體? -crystaldiskmark如何使用? crystaldiskmark是什麼軟體? -crystaldiskmark如何使用? Mar 18, 2024 pm 02:58 PM

CrystalDiskMark是一款適用於硬碟的小型HDD基準(zhǔn)測(cè)試工具,可快速測(cè)量順序和隨機(jī)讀取/寫(xiě)入速度。接下來(lái)就讓小編為大家介紹一下CrystalDiskMark,以及crystaldiskmark如何使用吧~一、CrystalDiskMark介紹CrystalDiskMark是一款廣泛使用的磁碟效能測(cè)試工具,用於評(píng)估機(jī)械硬碟和固態(tài)硬碟(SSD)的讀取和寫(xiě)入速度和隨機(jī)I/O性能。它是一款免費(fèi)的Windows應(yīng)用程序,並提供用戶(hù)友好的介面和各種測(cè)試模式來(lái)評(píng)估硬碟效能的不同方面,並被廣泛用於硬體評(píng)

BTCC教學(xué):如何在BTCC交易所綁定使用MetaMask錢(qián)包? BTCC教學(xué):如何在BTCC交易所綁定使用MetaMask錢(qián)包? Apr 26, 2024 am 09:40 AM

MetaMask(中文也叫小狐貍錢(qián)包)是一款免費(fèi)的、廣受好評(píng)的加密錢(qián)包軟體。目前,BTCC已支援綁定MetaMask錢(qián)包,綁定後可使用MetaMask錢(qián)包進(jìn)行快速登錄,儲(chǔ)值、買(mǎi)幣等,且首次綁定還可獲得20USDT體驗(yàn)金。在BTCCMetaMask錢(qián)包教學(xué)中,我們將詳細(xì)介紹如何註冊(cè)和使用MetaMask,以及如何在BTCC綁定並使用小狐貍錢(qián)包。 MetaMask錢(qián)包是什麼? MetaMask小狐貍錢(qián)包擁有超過(guò)3,000萬(wàn)用戶(hù),是當(dāng)今最受歡迎的加密貨幣錢(qián)包之一。它可免費(fèi)使用,可作為擴(kuò)充功能安裝在網(wǎng)絡(luò)

百度網(wǎng)盤(pán)app怎麼用 百度網(wǎng)盤(pán)app怎麼用 Mar 27, 2024 pm 06:46 PM

在如今雲(yún)端儲(chǔ)存已成為我們?nèi)粘I詈凸ぷ髦胁豢苫蛉钡囊徊糠帧0俣染W(wǎng)盤(pán)作為國(guó)內(nèi)領(lǐng)先的雲(yún)端儲(chǔ)存服務(wù)之一,憑藉其強(qiáng)大的儲(chǔ)存功能、高效的傳輸速度以及便捷的操作體驗(yàn),贏得了廣大用戶(hù)的青睞。而且無(wú)論你是想要備份重要文件、分享資料,還是在線(xiàn)上觀(guān)看影片、聽(tīng)取音樂(lè),百度網(wǎng)盤(pán)都能滿(mǎn)足你的需求。但很多用戶(hù)可能對(duì)百度網(wǎng)盤(pán)app的具體使用方法還不了解,那麼這篇教學(xué)就將為大家詳細(xì)介紹百度網(wǎng)盤(pán)app如何使用,還有疑惑的用戶(hù)們就快來(lái)跟著本文詳細(xì)了解一下吧!百度雲(yún)網(wǎng)盤(pán)怎麼用:一、安裝首先,下載並安裝百度雲(yún)軟體時(shí),請(qǐng)選擇自訂安裝選

網(wǎng)易信箱大師怎麼用 網(wǎng)易信箱大師怎麼用 Mar 27, 2024 pm 05:32 PM

網(wǎng)易郵箱,作為中國(guó)網(wǎng)友廣泛使用的一種電子郵箱,一直以來(lái)以其穩(wěn)定、高效的服務(wù)贏得了用戶(hù)的信賴(lài)。而網(wǎng)易信箱大師,則是專(zhuān)為手機(jī)使用者打造的信箱軟體,它大大簡(jiǎn)化了郵件的收發(fā)流程,讓我們的郵件處理變得更加便利。那麼網(wǎng)易信箱大師該如何使用,具體又有哪些功能呢,下文中本站小編將為大家?guī)?lái)詳細(xì)的內(nèi)容介紹,希望能幫助到大家!首先,您可以在手機(jī)應(yīng)用程式商店搜尋並下載網(wǎng)易信箱大師應(yīng)用程式。在應(yīng)用寶或百度手機(jī)助手中搜尋“網(wǎng)易郵箱大師”,然後按照提示進(jìn)行安裝即可。下載安裝完成後,我們打開(kāi)網(wǎng)易郵箱帳號(hào)並進(jìn)行登錄,登入介面如下圖所示

如何使用迅雷下載磁力鏈接 如何使用迅雷下載磁力鏈接 Feb 25, 2024 pm 12:51 PM

隨著網(wǎng)路科技的快速發(fā)展,我們的生活也得到了極大的便利,其中之一就是能夠透過(guò)網(wǎng)路下載和分享各種資源。而在下載資源的過(guò)程中,磁力連結(jié)成為了一種非常常見(jiàn)且方便的下載方式。那麼,迅雷磁力連結(jié)又是如何使用的呢?下面,我將給大家詳細(xì)介紹一下。迅雷是一款非常受歡迎的下載工具,它支援多種下載方式,其中包括磁力連結(jié)。磁力連結(jié)可以理解為一種下載位址,透過(guò)它我們可以取得資源的相關(guān)

小米汽車(chē)app怎麼用 小米汽車(chē)app怎麼用 Apr 01, 2024 pm 09:19 PM

小米汽車(chē)軟體提供遠(yuǎn)端車(chē)控功能,讓使用者可以透過(guò)手機(jī)或電腦遠(yuǎn)端控制車(chē)輛,例如開(kāi)關(guān)車(chē)輛的門(mén)窗、啟動(dòng)引擎、控制車(chē)輛的空調(diào)和音響等,下文就是這個(gè)軟體的使用及內(nèi)容,一起了解下吧。小米汽車(chē)app功能及使用方法大全1、小米汽車(chē)app在3月25日上線(xiàn)蘋(píng)果AppStore,現(xiàn)在安卓手機(jī)的應(yīng)用商店中也可以下載了;購(gòu)車(chē):了解小米汽車(chē)核心亮點(diǎn)和技術(shù)參數(shù),可預(yù)約試駕、配置訂購(gòu)您的小米汽車(chē),支援線(xiàn)上處理提車(chē)待辦事項(xiàng)。 3.社群:了解小米汽車(chē)品牌資訊,交流用車(chē)體驗(yàn),分享精彩車(chē)生活;4、車(chē)控:手機(jī)就是遙控器,遠(yuǎn)端控制,即時(shí)安防,輕

教你使用 iOS 17.4「失竊裝置保護(hù)」新進(jìn)階功能 教你使用 iOS 17.4「失竊裝置保護(hù)」新進(jìn)階功能 Mar 10, 2024 pm 04:34 PM

Apple在周二推出了iOS17.4更新,為iPhone帶來(lái)了一系列新功能和修復(fù)。這次更新包含了全新的表情符號(hào),同時(shí)歐盟用戶(hù)也能夠下載其他應(yīng)用程式商店。此外,更新還加強(qiáng)了對(duì)iPhone安全性的控制,引入了更多的「失竊設(shè)備保護(hù)」設(shè)定選項(xiàng),為用戶(hù)提供更多選擇和保障。 "iOS17.3首次引入了「失竊設(shè)備保護(hù)」功能,為用戶(hù)的敏感資料增加了額外的安全保障。當(dāng)用戶(hù)不在家等熟悉地點(diǎn)時(shí),該功能要求用戶(hù)首次輸入生物特徵信息,並在一小時(shí)後再次輸入資訊才能存取和更改某些數(shù)據(jù),如修改AppleID密碼或關(guān)閉失竊設(shè)備保護(hù)功能

See all articles