自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

RabbitMQ消息傳遞模式和NetCore案例

開(kāi)發(fā) 架構(gòu)
引入RabbitMQ可以實(shí)現(xiàn)應(yīng)用程序和其他服務(wù)之間的異步通信,這種方式可以大大提高系統(tǒng)的可靠性、擴(kuò)展性和性能。特別是在高并發(fā)的情況下,使用RabbitMQ可以避免系統(tǒng)響應(yīng)變慢,提高系統(tǒng)的吞吐量。

RabbitMQ中有四種基本的消息傳遞模式,它們是:

1. Direct模式:Exchange將消息路由到與Routing Key完全匹配的Queue中。

2. Fanout模式:Exchange將消息路由到所有與其綁定的Queue中。

3. Topic模式:Exchange將消息路由到所有與其綁定的Queue中,同時(shí)根據(jù)指定的通配符規(guī)則進(jìn)行匹配,實(shí)現(xiàn)靈活的消息路由。

4. Header模式:Exchange不使用Routing Key進(jìn)行消息路由,而是利用消息Header中設(shè)置的鍵值對(duì)進(jìn)行路由。

下面是詳細(xì)介紹:

Direct模式

在Direct模式中,Exchange將消息路由到與Routing Key完全匹配的Queue中。這種模式下,可以使用RabbitMQ的默認(rèn)交換機(jī)(direct類型),也可以創(chuàng)建自定義的交換機(jī)。

在生產(chǎn)者發(fā)送消息時(shí),需要將消息指定一個(gè)Routing Key,該Routing Key與消費(fèi)者綁定的隊(duì)列名稱相同,Exchange將消息路由到和該Routing Key相同的隊(duì)列中,消費(fèi)者就可以獲取到隊(duì)列中的消息了。

Fanout模式

在Fanout模式中,Exchange將消息路由到所有與其綁定的Queue中。這種模式下,只能使用自定義的交換機(jī)(fanout類型),Exchange不會(huì)考慮Routing Key的情況,直接把消息分發(fā)給所有綁定的隊(duì)列。

Topic模式

在Topic模式中,Exchange將消息路由到所有與其綁定的Queue中,同時(shí)根據(jù)指定的通配符規(guī)則進(jìn)行匹配,實(shí)現(xiàn)靈活的消息路由。這種模式下,可以使用自定義的交換機(jī)(topic類型)。

在生產(chǎn)者發(fā)送消息時(shí),需要將消息指定一個(gè)Routing Key,而消費(fèi)者則需要指定一個(gè)匹配模式(例如"*.logs"),當(dāng)Exchange收到消息時(shí),會(huì)根據(jù)Routing Key和通配符規(guī)則來(lái)判斷應(yīng)該將消息發(fā)送給哪些隊(duì)列。

Header模式

在Header模式中,Exchange不使用Routing Key進(jìn)行消息路由,而是利用消息Header中設(shè)置的鍵值對(duì)進(jìn)行路由。這種模式下,可以使用自定義的交換機(jī)(header類型)。

在生產(chǎn)者發(fā)送消息時(shí),需要指定一個(gè)包含鍵值對(duì)的Header,消費(fèi)者則需要指定一組鍵值對(duì),只有當(dāng)消息Header中的鍵值對(duì)滿足消費(fèi)者指定的條件時(shí),才會(huì)將消息發(fā)送給消費(fèi)者。

在Netcore開(kāi)發(fā)的項(xiàng)目中引入RabbitMQ可以實(shí)現(xiàn)應(yīng)用程序和其他服務(wù)之間的異步通信,這種方式可以大大提高系統(tǒng)的可靠性、擴(kuò)展性和性能。下面給出一個(gè)案例來(lái)說(shuō)明引入RabbitMQ的具體應(yīng)用。

假設(shè)我們正在開(kāi)發(fā)一個(gè)電商網(wǎng)站,當(dāng)用戶下單時(shí),需要通知訂單處理系統(tǒng)進(jìn)行訂單處理和庫(kù)存管理。采用傳統(tǒng)同步方式,應(yīng)用程序會(huì)等待訂單處理完成之后才繼續(xù)進(jìn)行,這會(huì)降低應(yīng)用程序的響應(yīng)速度和吞吐量;另外,如果訂單處理系統(tǒng)出現(xiàn)故障或者繁忙,應(yīng)用程序也會(huì)出現(xiàn)阻塞。而通過(guò)引入RabbitMQ,我們可以將訂單信息發(fā)送到一個(gè)隊(duì)列中,然后由訂單處理系統(tǒng)異步地從隊(duì)列中獲取訂單信息進(jìn)行處理,這樣就可以使得應(yīng)用程序能夠快速響應(yīng)客戶請(qǐng)求同時(shí)保證訂單的處理不被阻塞。如果訂單處理系統(tǒng)出現(xiàn)故障或者繁忙,消息可以在隊(duì)列中等待并重試,這樣可以提高系統(tǒng)的可靠性。

以下是一個(gè)基于Netcore開(kāi)發(fā)的電商網(wǎng)站采用RabbitMQ異步處理訂單的實(shí)現(xiàn)示例:

安裝RabbitMQ.Client

在Netcore項(xiàng)目中,我們可以通過(guò)NuGet包管理器安裝RabbitMQ.Client庫(kù)來(lái)引入RabbitMQ客戶端。

配置RabbitMQ連接信息

在appsettings.json文件中添加RabbitMQ連接信息的配置:

{
"RabbitMQ": {
"HostName": "localhost",
"UserName": "guest",
"Password": "guest",
"VirtualHost": "/"
}
}

創(chuàng)建RabbitMQ服務(wù)

創(chuàng)建一個(gè)名為RabbitMQService的服務(wù),在這個(gè)服務(wù)中我們可以封裝一些RabbitMQ方法,比如發(fā)送消息到隊(duì)列等,具體實(shí)現(xiàn)如下:

using RabbitMQ.Client;
using System.Text;
public class RabbitMQService
{
private readonly IConfiguration _configuration;
public RabbitMQService(IConfiguration configuration)
{
_configuration = configuration;
}
public void SendMessage(string queueName, string message)
{
var factory = new ConnectionFactory()
{
HostName = _configuration["RabbitMQ:HostName"],
UserName = _configuration["RabbitMQ:UserName"],
Password = _configuration["RabbitMQ:Password"],
VirtualHost = _configuration["RabbitMQ:VirtualHost"]
};
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queueName, durable: false, exclusive: false, autoDelete: false, arguments: null);
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "", routingKey: queueName, basicProperties: null, body: body);
}
}
}
}

創(chuàng)建訂單控制器

在Netcore項(xiàng)目中,我們可以創(chuàng)建一個(gè)名為OrderController的控制器,當(dāng)用戶下單時(shí),控制器通過(guò)調(diào)用RabbitMQService中的方法將訂單信息發(fā)送到一個(gè)隊(duì)列中,然后立即返回一個(gè)成功響應(yīng)。

[ApiController]
public class OrderController : ControllerBase
{
private readonly RabbitMQService _rabbitMQService;
public OrderController(RabbitMQService rabbitMQService)
{
_rabbitMQService = rabbitMQService;
}
[HttpPost]
public IActionResult CreateOrder(Order order)
{
// 處理訂單邏輯
...
// 發(fā)送訂單消息到RabbitMQ
_rabbitMQService.SendMessage("order_queue", JsonConvert.SerializeObject(order));
return Ok("Order created successfully.");
}
}

創(chuàng)建訂單處理服務(wù)

創(chuàng)建一個(gè)名為OrderProcessingService的服務(wù),用于從隊(duì)列中獲取訂單信息,并進(jìn)行訂單處理和庫(kù)存管理等。具體實(shí)現(xiàn)如下:

using System.Text;
using System.Threading.Tasks;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
public class OrderProcessingService : BackgroundService
{
private readonly IConfiguration _configuration;
public OrderProcessingService(IConfiguration configuration)
{
_configuration = configuration;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var factory = new ConnectionFactory()
{
HostName = _configuration["RabbitMQ:HostName"],
UserName = _configuration["RabbitMQ:UserName"],
Password = _configuration["RabbitMQ:Password"],
VirtualHost = _configuration["RabbitMQ:VirtualHost"]
};
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "order_queue",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
var order = JsonConvert.DeserializeObject<Order>(message);
Console.WriteLine($"Order processed: {order.OrderNumber}");
};
channel.BasicConsume(queue: "order_queue", autoAck: true, consumer: consumer);
await Task.Delay(Timeout.Infinite, stoppingToken);
}
}
}

在以上代碼中,我們使用了Netcore中的BackgroundService類來(lái)創(chuàng)建一個(gè)訂單處理服務(wù)。在ExecuteAsync方法中,我們通過(guò)創(chuàng)建RabbitMQ連接,然后從隊(duì)列中獲取訂單信息,并進(jìn)行訂單處理。當(dāng)消息被成功消費(fèi)后,隊(duì)列會(huì)自動(dòng)將消息刪除。

引入RabbitMQ可以實(shí)現(xiàn)應(yīng)用程序和其他服務(wù)之間的異步通信,這種方式可以大大提高系統(tǒng)的可靠性、擴(kuò)展性和性能。特別是在高并發(fā)的情況下,使用RabbitMQ可以避免系統(tǒng)響應(yīng)變慢,提高系統(tǒng)的吞吐量。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2024-04-03 11:36:09

KafkaRabbitMQ架構(gòu)

2024-09-30 09:48:41

RabbitMQ消息中間件

2023-11-08 07:51:11

RabbitMQ接收消息

2012-02-06 09:48:55

紅帽功能

2024-07-29 08:34:18

C++訂閱者模式線程

2010-08-02 16:59:54

2023-11-20 08:54:38

2016-11-28 14:40:00

MQTT消息協(xié)議

2024-11-20 15:43:27

2022-11-23 07:30:11

2023-12-04 09:23:49

分布式消息

2021-11-03 10:52:39

數(shù)據(jù)庫(kù)

2024-05-09 08:04:23

RabbitMQ消息可靠性

2022-07-26 20:00:35

場(chǎng)景RabbitMQMQ

2020-10-14 08:36:10

RabbitMQ消息

2024-05-23 12:11:39

2024-12-18 07:43:49

2022-08-02 11:27:25

RabbitMQ消息路由

2009-06-14 17:18:55

ibmdwWebSphereMQ

2023-06-05 08:14:17

RabbitMQ兔子MQ開(kāi)源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)