Почему метод consume не выполняется с использованием MassTransit, брокера RabbitMQ и .Сеть в приложении на основе микросервиса?

#c# #.net #rabbitmq #microservices #masstransit

Вопрос:

Я создаю приложение на основе микросервиса, которое содержит два микросервиса, которые обмениваются данными через брокера RabbitMQ. Событие публикуется всякий раз, когда книга создается, обновляется или удаляется. Публикация из первого микросервиса работает нормально, но в другом микросервисе ничего не используется. Ничего не помещается в очереди, хотя очереди запущены и работают. Я использую MassTransit и RabbitMQ с a .Сетевое приложение с использованием Visual Studio 2019. Ниже приведен мой код конфигурации в файле Startup.cs

 services.AddMassTransit(x =>
        {
            x.AddConsumer<BookCreationConsumer>();
            x.AddConsumer<BookUpdatingConsumer>();
            x.AddConsumer<BookDeletionConsumer>();

            x.UsingRabbitMq((context, configurator) =>
            {
                var rabbitMQSettings = Configuration.GetSection(nameof(RabbitMQSettings)).Get<RabbitMQSettings>();
                configurator.Host(rabbitMQSettings.Host);

                 configurator.ReceiveEndpoint("BookCreation-Queue", c =>
                 {
                     c.ConfigureConsumer<BookCreationConsumer>(context);
                 });

                 configurator.ReceiveEndpoint("BookUpdating-Queue", c =>
                 {
                     c.ConfigureConsumer<BookUpdatingConsumer>(context);
                 });

                 configurator.ReceiveEndpoint("BookDeletion-Queue", c =>
                 {
                     c.ConfigureConsumer<BookDeletionConsumer>(context);
                 });
            });
        });
        
        services.AddMassTransitHostedService();
 

Я реализовал классы потребителей, унаследованные от интерфейса IConsumer MassTransit. Несмотря на это, микросервис получателя не потребляет сообщения. Метод потребления вообще не поражен! Ниже приведен код для потребителя события создания:

 public class BookCreationConsumer : IConsumer<BookCreationEvent>
{
    private readonly IBooksInfoRepository repository;

    public BookCreationConsumer(IBooksInfoRepository repository)
    {
        this.repository = repository;
    }

    public async Task Consume(ConsumeContext<BookCreationEvent> context)
    {
        var message = context.Message;

        var book = await repository.GetBookInfo(message.BookID);

        if (book != null)
            return;

        book = new BookInfo
        {
            id = message.BookID,
            Title = message.Title,
            Author = message.Author,
            Edition = message.Edition,
            NumberOfPages = message.NumOfPages,
            BookURL = message.BookURL 
        };

        await repository.AddBookInfo(book);
    }
 

Что может быть причиной неиспользования сообщений?

Спасибо

Комментарии:

1. Если у вас установлен плагин управления RabbitMQ, вы можете проверить сопоставления очередей там.

Ответ №1:

Проверьте очередь конечной точки приема и привязки exchange. Скорее всего, у потребителя есть контракты на массаж, объявленные в другом пространстве имен. Вы также увидите, что не только ваш потребитель не запускается, но и очереди ваших конечных точек пусты.

Очередь конечных точек должна быть привязана к обмену конечными точками, а обмен конечными точками должен быть привязан к обмену сообщениями. У каждого обмена сообщениями есть имя контракта на сообщение, которое там публикуется. Если пространство имен контракта опубликованного сообщения не совпадает с пространством имен контракта сообщения на стороне потребителя, привязки будут созданы неправильно.

Это полностью описано в документах.

Все это можно легко проверить в веб-интерфейсе администратора RabbitMQ.

Комментарии:

1. Да, вы правы, господин Алексей. Я использовал разные пространства имен для издателя и потребительских контрактов, поэтому привязка между ними была неправильной. Теперь он работает нормально. Большое вам спасибо, я действительно ценю вашу помощь.