МассТранзит и Вещание - PullRequest
2 голосов
/ 12 марта 2019

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

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

Из-за моей жизни мне трудно понять, что я делаю неправильно.

NuGets:

  • MassTransit.Extensions.DependencyInjection 5.3.2
  • MassTransit.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 Ответ

2 голосов
/ 12 марта 2019

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

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

enter image description here

...