C# Academy · Урок

Создание и обработка сообщений

Отправляйте и обрабатывайте сообщения с помощью MassTransit.

Урок 2 из 413 шагов

«Создание и обработка сообщений» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Регистрация MassTransit

Настройте MassTransit в DI: зарегистрируйте его, укажите транспорт (здесь RabbitMQ) и позвольте ему обнаружить Ваших потребителей.

builder.Services.AddMassTransit(x =>
{
    x.AddConsumers(typeof(Program).Assembly);
    x.UsingRabbitMq((context, cfg) =>
    {
        cfg.Host("localhost");
        cfg.ConfigureEndpoints(context);
    });
});

Определение потребителя

Потребитель реализует IConsumer<T> для типа сообщения, которое он обрабатывает. Ваша логика находится в Consume, получающем ConsumeContext<T>.

public class OrderPlacedConsumer : IConsumer<OrderPlaced>
{
    public async Task Consume(ConsumeContext<OrderPlaced> context)
    {
        OrderPlaced message = context.Message;
        // handle the event
    }
}

Публикация события

Внедрите IPublishEndpoint и вызовите Publish, чтобы распространить событие среди всех подписчиков.

public class OrderService
{
    private readonly IPublishEndpoint _publish;
    public OrderService(IPublishEndpoint publish) => _publish = publish;

    public Task PlaceOrderAsync(Guid id, string email) =>
        _publish.Publish(new OrderPlaced(id, email));
}

Отправка команды

Команды отправляются в конкретную конечную точку. Получите ISendEndpoint для назначения и вызовите Send.

var endpoint = await _sendProvider
    .GetSendEndpoint(new Uri("queue:charge-payment"));
await endpoint.Send(new ChargePayment(orderId, amount));

Сравнение Publish и Send

Publish используется для событий и доставляет их каждому подписанному потребителю, а Send — для команд и направляет команду в одну очередь. Правильный выбор определяет поведение маршрутизации.

Возможности ConsumeContext

ConsumeContext предоставляет не только сообщение: идентификаторы корреляции, заголовки, а также возможность публиковать сообщения или отправлять ответы из потребителя, что позволяет выстраивать цепочки сообщений.

public async Task Consume(ConsumeContext<OrderPlaced> context)
{
    await context.Publish(new InvoiceRequested(context.Message.OrderId));
}

Запрос и ответ

MassTransit также поддерживает обмен запросами и ответами посредством сообщений. Клиент запросов отправляет запрос и ожидает типизированный ответ. Это удобно, когда Вам нужен ответ, но Вы по-прежнему хотите сохранить слабую связанность с брокером.

var response = await _client
    .GetResponse<OrderStatus>(new GetOrder(orderId));
OrderStatus status = response.Message;

Именование конечных точек

ConfigureEndpoints автоматически именует конечную точку приёма (очередь) для каждого потребителя, используя соглашения. При необходимости Вы можете настроить имена с помощью форматтеров или явной конфигурации.

Сериализация сообщений

По умолчанию MassTransit сериализует сообщения в формате JSON и добавляет метаданные (тип сообщения, идентификаторы). Производители и потребители используют общие типы контракта сообщений, которые часто находятся в общем пакете.

Параллельная обработка

Потребитель может обрабатывать множество сообщений параллельно. Настройте PrefetchCount и ограничения параллелизма, чтобы сбалансировать пропускную способность и возможности последующих систем.

cfg.ReceiveEndpoint("orders", e =>
{
    e.PrefetchCount = 16;
    e.ConcurrentMessageLimit = 8;
    e.ConfigureConsumer<OrderPlacedConsumer>(context);
});

Тестирование потребителей

MassTransit предоставляет тестовый стенд в памяти, поэтому Вы можете опубликовать сообщение и проверить, что потребитель его обработал, без настоящего брокера.

Быстрая проверка

Проверьте создание и обработку сообщений.

Итоги

Зарегистрируйте MassTransit с помощью AddMassTransit, транспорта и ConfigureEndpoints. Потребители реализуют IConsumer<T> с методом Consume. Используйте IPublishEndpoint.Publish для событий (всех подписчиков) и ISendEndpoint.Send для команд (одной очереди). ConsumeContext позволяет выстраивать цепочки и реализовывать обмен запросами и ответами, а тестовый стенд проверяет потребителей в памяти.

Можно начать бесплатно

Изучай C# с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
93
Уроки
346

Часто задаваемые вопросы

Урок «Создание и обработка сообщений» бесплатный?

Да — полный текст урока «Создание и обработка сообщений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Создание и обработка сообщений»?

Отправляйте и обрабатывайте сообщения с помощью MassTransit. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Создание и обработка сообщений»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы обмена сообщениями
  2. Создание и обработка сообщений
  3. Саги и рабочие процессы
  4. Обработка ошибок и повторные попытки
← Назад к C# Academy