消息隊列--RabbitMQ(二)

1.經常使用的幾種隊列簡介

RabbitMQ有五種經常使用的隊列,分別是:簡單隊列、work模式、發佈訂閱模式、路由模式、主題(Topic)模式。其實發布訂閱、路由、主題這三種模式都從屬於與routingkey相關的模式,因此從性質上來講能夠說是屬於同一類。接下來,咱們就以簡述與代碼的形式,來分別解釋一下這幾種模式。數據庫

2.相關名詞解釋

   Publish:發佈者(消息的生產方)編碼

   Consumer:使用者(消息的消耗方)blog

   Exchange:交換機(消息的中轉站)--後面與routingkey相關的模式會作出相應的解釋接口

   VirtrulHost:虛擬主機(在消息系統內開闢的一個放置或者是寄存隊列的一個區域,至關於數據庫概念)隊列

   Queue:消息隊列(至關於數據庫中的表)路由

   Channel:通道(構建消費者與生產者消息溝通的渠道)開發

 3.幾種隊列模式的簡述及編碼實現

      (1)簡單模式:消息隊列

           所謂簡單模式就是由一個生產者、一個消費者,外加一個渠道構建的最爲簡單的生產消費模式。生產者經過渠道完成消息的推送,消費者接受消息並使用,如此簡單。string

           eg. Clientit

            //1.構建一個鏈接工廠

            var factory = new ConnectionFactory() {

                HostName="localhost",//主機名

                Port=5672,   //端口號

                VirtualHost="/lsh-blog",  //要使用的虛擬主機名

                UserName="lsh",  //帳號

                Password="lsh"   //密碼

               

             };

            Console.WriteLine("接下來要發10條消息。。。");

            //2.構建一個鏈接

            using (var connection = factory.CreateConnection())

            {

                //3。構建一個通道

                using (var channel = connection.CreateModel())

                {

                    channel.QueueDeclare("lko",false,false,false,null);

                    //推送消息

                    string msg = "我來發布一條最簡單的消息";

                     //推送消息

                    channel.BasicPublish("",routingKey: "",

                                             basicProperties: null,

                                            body: Encoding.UTF8.GetBytes(msg));

                }

            }

            Console.ReadKey();

   Consumer:

                       /*

             consumer  

             */

            Console.WriteLine("接收消息中。。。");

            var factory = new ConnectionFactory()

            {

                HostName = "localhost",

                Port = 5672,

                VirtualHost = "/lsh-blog",

                UserName = "lsh",

                Password = "lsh",

            };

            using (var connection = factory.CreateConnection())

            using (var channel = connection.CreateModel())

            {

                channel.QueueDeclare(queue: "lko",

                                        durable: false,

                                        exclusive: false,

                                        autoDelete: true,

                                        arguments: null);

 

                var consumer = new EventingBasicConsumer(channel);

                consumer.Received += (model, ea) =>

                {

                    var body = ea.Body;

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

                    Console.WriteLine(" [Consumer] Received {0}", message);

                    Thread.Sleep(2000);

                    channel.BasicAck(ea.DeliveryTag, false);

                };

                channel.BasicConsume(queue: "lko",

                                     noAck: false,

                                     consumer: consumer);

                Console.ReadLine();

 

(2)Work模式

   由一個生產者、多個消費者以及驅動組成。RabbitMQ隊列有一個消息競爭原則,就是同時消費同一條隊列的幾個消費者,對於隊列的消息都是誰先獲取就被誰消費,沒有重複或者不被消費這一說。於是,該模式只是一種特性,因此就不用代碼說明啦。

(3) 發佈訂閱模式

   發佈訂閱就是生產方發佈一個入口,使用方就能夠接入這個入口,從而作到數據的流通。這樣的話,全部的使用方均可以接入這個入口,從而獲得數據信息。該模式所須要藉助的,即是交換機(Exchange)這個概念,以交換機做爲入口,消費使用者進行綁定接入。

eg. Publish

   //1.構建一個鏈接工廠

            var factory = new ConnectionFactory() {

                HostName="localhost",//主機名

                Port=5672,   //端口號

                VirtualHost="/lsh-blog",  //要使用的虛擬主機名

                UserName="lsh",  //帳號

                Password="lsh"   //密碼

               

             };

            Console.WriteLine("接下來要發10條消息。。。");

            //2.構建一個鏈接

            using (var connection = factory.CreateConnection())

            {

                //3。構建一個通道

                using (var channel = connection.CreateModel())

                {

 

                    //定義交換機(fanout爲交換機類型)

                    channel.ExchangeDeclare("search_direct", "fanout");

                    //推送消息

                    string msg = "我來發布一條最簡單的消息";

                     //推送消息

                    channel.BasicPublish("search_direct", routingKey: "",

                                             basicProperties: null,

                                            body: Encoding.UTF8.GetBytes(msg));

                   

                }

            }

            Console.ReadKey();

  

  Consumer:

     /*

             consumer  

             */

            Console.WriteLine("接收消息中。。。");

            var factory = new ConnectionFactory()

            {

                HostName = "localhost",

                Port = 5672,

                VirtualHost = "/lsh-blog",

                UserName = "lsh",

                Password = "lsh",

            };

            using (var connection = factory.CreateConnection())

            using (var channel = connection.CreateModel())

            {

                channel.QueueDeclare(queue: "lko",

                                        durable: false,

                                        exclusive: false,

                                        autoDelete: true,

                                        arguments: null);

                //將隊列lko與交換機search_direct進行綁定接入

                channel.QueueBind("lko", "search_direct","");

                var consumer = new EventingBasicConsumer(channel);

                consumer.Received += (model, ea) =>

                {

                    var body = ea.Body;

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

                    Console.WriteLine(" [Consumer] Received {0}", message);

                    Thread.Sleep(2000);

                    channel.BasicAck(ea.DeliveryTag, false);

                };

                channel.BasicConsume(queue: "lko",

                                     noAck: false,

                                     consumer: consumer);

                Console.ReadLine();

 

(4) 路由模式

     路由模式就是以交換機爲開發接口,rotingkey做爲惟一的過濾篩選標識來實現消息 的發佈與使用。這樣的話,消費者就能夠只消費綁定當前交換機發過來的某一個或某一些rotingkey的消息進行選擇性處理啦。發佈方,咱們只需在上面說過的發佈訂閱模式的交換及類型fanout改成direct(即:channel.ExchangeDeclare("search_direct", "fanout"), channel.BasicPublish("search_direct", routingKey: "",basicProperties: null,body: Encoding.UTF8.GetBytes(msg));),消費使用方綁定本身隊列想要接收的某一些routngkey的消息便可(即: channel.QueueBind("lko", "search_direct","item.del");channel.QueueBind("lko", "search_direct","item.add");…).

   (5)Topic話題模式

      能夠說是帶有模糊匹配消費性質的路由模式,也就是說,發佈方的交換機類型變成topic,其他的能夠保持原封不變,而接收方能夠消費一個消費區間或者也能夠說是符合某條件的routingkey集合的進行消費使用(即:消費方channel.QueueBind("lko", "search_direct","item.#"),來匹配全部以item開頭的全部roukingkey的消息進行消費使用)

4.總結

   至此,RabbitMQ經常使用的幾種消費隊列模式就簡單的介紹完啦,可能有不是很完善的介紹說明,還請諸位多多諒解,後期會不斷的完善。下一篇,我將談一下我所瞭解的RabbitMQ的使用場景及基於C#的RabbitMQ.dll客戶端相關封裝的一款組件—EasyNetMQ進行簡單的使用分析,歡迎各位大佬指點批評~

相關文章
相關標籤/搜索