День 2337. #ЗаметкиНаПолях
RabbitMQ в .NET с Нуля. Начало
RabbitMQ — это брокер сообщений. Он как надёжный почтовый сервис для вашего ПО. Вместо того, чтобы одна система напрямую вызывала другую (что создаёт тесную связь), RabbitMQ выступает в качестве посредника:
- одна часть вашего приложения отправляет сообщение,
- другая часть получает и обрабатывает его.
Это называется асинхронной связью, и отлично подходит для производительности, надёжности и масштабируемости.
Ключевые компоненты:
- Производитель (Producer) – отправляет сообщения.
- Потребитель (Consumer) – получает сообщения.
- Очередь (Queue) – место, где сообщения ждут обработки.
- Обменник (Exchange) – «диспетчер», который направляет сообщения в соответствующие очереди.
- Привязка (Binding) – правила, которые связывают обменники с очередями.
Установка RabbitMQ (локально с Docker)
1. Выполните команду:
docker run -d --hostname rabbitmq
--name rabbitmq \
-p 5672:5672 -p 15672:15672 rabbitmq:3-management
2. Зайдите в панель управления http://localhost:15672. Вход по умолчанию: guest/guest
Реализация в .NET
Создадим простой проект:
- API отправляет «e-mail» в RabbitMQ,
- фоновый сервис прослушивает и «обрабатывает» сообщение.
Добавим RabbitMQ в проект:
Install-Package RabbitMQ.Client
Определим класс сообщения:
public record Email(string To, string Subject, string Body);
Производитель
Его роль – отправлять сообщения в RabbitMQ. Он должен:
- подключиться к RabbitMQ,
- создать очередь (или проверить её существование),
- сериализовать сообщение (например, в JSON),
- отправить сообщение в очередь.
public class EmailPublisher
{
private const string QUEUE =
"email-queue";
public async Task Publish(Email email)
{
var fctry = new ConnectionFactory() {
HostName = "localhost" };
using var conn =
await fctry.CreateConnectionAsync();
using var channel =
await conn.CreateChannelAsync();
// Создаём очередь
await channel.QueueDeclareAsync(
queue: QUEUE,
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
// Создаём сообщение
var msg = JsonSerializer.Serialize(email);
var body = Encoding.UTF8.GetBytes(msg);
// Публикуем
await channel.BasicPublishAsync(
exchange: string.Empty,
routingKey: QUEUE,
mandatory: true,
basicProperties:
new BasicProperties { Persistent = true },
body: body);
}
}
Параметры очереди:
- durable: сохранять на диске, чтобы очередь не терялась при перезапуске брокера,
- exclusive: может ли использоваться другими соединениями,
- autoDelete: удалять ли сообщения при отключении последнего потребителя.
Продолжение следует…
Источник: https://thecodeman.net/posts/rabbitmq-in-dotnet-from-scratch
>>Click here to continue<<