Массовый переход и широковещательная передача

#c# #rabbitmq #masstransit

#c# #rabbitmq #массовый переход

Вопрос:

Я пытаюсь запустить систему обмена сообщениями между несколькими приложениями. У меня запущен экземпляр RabbitMQ, и, похоже, все в порядке. Я могу подключить нескольких подписчиков / издателей к экземпляру RabbitMQ, и, похоже, с ними все в порядке. Затем я могу опубликовать сообщение от одного издателя, но сообщение получает только один подписчик.

Я считаю, что это связано с тем, как я устанавливаю очереди. Я просмотрел руководство по Rabbit, https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html , но я не знаю, надеюсь, что это переведется в библиотеку Masstransit.

Хоть убейте, у меня никак не получается понять, что я делаю не так.

NuGets:

  • Массовый переход.Расширения.DependencyInjection 5.3.2
  • Массовый переход.RabbitMQ 5.3.2

Кто-нибудь может помочь?

         // Register MassTransit
        services.AddMassTransit(mtCfg =>
        {
            mtCfg.AddConsumer<DomainMessageConsumer>();

            mtCfg.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(rbCfg =>
            {
                var host = rbCfg.Host(settings.RabbitMq.Host, settings.RabbitMq.VirtualHost, h =>
                {
                    h.Username(settings.RabbitMq.Username);
                    h.Password(settings.RabbitMq.Password);
                });

                rbCfg.ReceiveEndpoint(host, settings.RabbitMq.ConnectionName, ep =>
                {
                    ep.PrefetchCount = 16;
                    ep.UseMessageRetry(x => x.Interval(2, 100));

                    ep.ConfigureConsumer<DomainMessageConsumer>(provider);
                });
            }));
        });
  

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

1. Я предлагаю вам начать с чтения документов о MassTransit, а не RMQ : masstransit-project.com/MassTransit/usage /… и masstransit-project.com/MassTransit/troubleshooting /…

Ответ №1:

Проблема, с которой вы сталкиваетесь, заключается в том, что вы используете одно и то же имя очереди для всех потребителей. Если вы хотите широковещательную передачу для всех потребителей, вы должны сделать все имена очередей уникальными. В вашем примере кода это settings.RabbitMq.ConnectionName переменная, которую вы должны сделать уникальной для каждого потребителя.

Посмотрите на картинку ниже и представьте, Subscription B какую очередь settings.RabbitMq.ConnectionName вы установили. То, что вы получите, — это только Subscriber B1 получаемая левая часть изображения (на самом деле это циклическая балансировка, но это будет оффтопик). Если вы хотите широковещательную передачу, вы можете создать отдельные подписки (или settings.RabbitMq.ConnectionName в вашем примере).

введите описание изображения здесь