RabbitMQ有五種經常使用的隊列,分別是:簡單隊列、work模式、發佈訂閱模式、路由模式、主題(Topic)模式。其實發布訂閱、路由、主題這三種模式都從屬於與routingkey相關的模式,因此從性質上來講能夠說是屬於同一類。接下來,咱們就以簡述與代碼的形式,來分別解釋一下這幾種模式。數據庫
Publish:發佈者(消息的生產方)編碼
Consumer:使用者(消息的消耗方)blog
Exchange:交換機(消息的中轉站)--後面與routingkey相關的模式會作出相應的解釋接口
VirtrulHost:虛擬主機(在消息系統內開闢的一個放置或者是寄存隊列的一個區域,至關於數據庫概念)隊列
Queue:消息隊列(至關於數據庫中的表)路由
Channel:通道(構建消費者與生產者消息溝通的渠道)開發
(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的消息進行消費使用)
至此,RabbitMQ經常使用的幾種消費隊列模式就簡單的介紹完啦,可能有不是很完善的介紹說明,還請諸位多多諒解,後期會不斷的完善。下一篇,我將談一下我所瞭解的RabbitMQ的使用場景及基於C#的RabbitMQ.dll客戶端相關封裝的一款組件—EasyNetMQ進行簡單的使用分析,歡迎各位大佬指點批評~