【问题标题】:Why a simple configuration in MassTransit creates 2 queues and 3 exchanges?为什么 MassTransit 中的简单配置会创建 2 个队列和 3 个交换?
【发布时间】:2019-05-09 16:54:03
【问题描述】:

我创建了一个 MassTransit 快速入门程序来与我的本地主机 RabbitMQ 进行交互:

namespace ConsoleApp1
{
    public static class Program
    {
        public class YourMessage
        {
            public string Text { get; set; }
        }

        public static async Task Main(params string[] args)
        {
            var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
            {
                var host = sbc.Host(new Uri("rabbitmq://localhost"), h =>
                {
                    h.Username("guest");
                    h.Password("guest");
                });

                sbc.ReceiveEndpoint(host, "test_queue", ep =>
                {
                    ep.Handler<YourMessage>(async context => await Console.Out.WriteLineAsync($"Received: {context.Message.Text}"));
                });
            });

            await bus.StartAsync(); 
            await bus.Publish(new YourMessage{Text = "Hi"});
            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
            await bus.StopAsync();
        }
    }
}

一切看起来都很好,直到我真正检查了底层的 RabbitMQ 管理并发现仅针对这个非常简单的程序,MassTransit 创建了 3 个交换和 2 个队列。

交换,所有扇出:

  • ConsoleApp1:Program-YourMessage:耐用
  • VP0003748_dotnet_bus_6n9oyyfzxhyx9ybobdmpj8qeyt:自动删除和持久化?
  • test_queue: 耐用

队列:

  • VP0003748_dotnet_bus_6n9oyyfzxhyx9ybobdmpj8qeyt: x-expire 60000
  • test_queue: 耐用

我想知道为什么所有这些都是必要的或者是默认配置?特别是,我不太确定要创建这么多“很多”。

【问题讨论】:

  • 您使用哪个版本的 MassTransit?此问题可在 5.5.6 版中重现,但 6.0.0 版不会创建未使用的自动删除交换和队列。至于现在,修复后找不到提交(github.com/MassTransit/MassTransit/releases/tag/v6.0.0
  • @PylypLebediev 我相信当时它是 5.5.5 版。

标签: c# .net-core rabbitmq masstransit


【解决方案1】:

documentation中都有描述。

ConsoleApp1:Program-YourMessage是消息合约交换,这里正在发布消息。

test_queue 是端点交换。它绑定到消息交换。这样,当您有多个消费者使用相同的消息类型 (pub-sub) 时,他们都会获得消息的副本。

test_queue 是队列,它绑定到端点交换。 RMQ 中的发布-订阅需要交换,并且队列可以找到交换,因此消息可以正确传递。

non-durable queue和exchange都是端点临时队列和exchange,用于request-response。

【讨论】:

  • 我在文档中找不到该信息,我可以阻止创建非持久队列和交换吗?我的意思是,如果我们不使用请求-响应,而只是定期发布?为不同的 .NET 类型使用相同的交换名称也是一个问题吗?
  • 我不这么认为,但是拥有它们到底有什么问题?
  • 只是想用更明确的方式更改他们的名字或避免他们的创建。我的意思是,如果我们不使用 RabbitMQ 的那个特性,那么拥有它们有什么意义呢?
  • 消息队列的名称可以通过使用 sbc.OverrideDefaultBusEndpointQueueName("endpoint"); IRabbitMqBusFactoryConfigurator的方法
猜你喜欢
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
相关资源
最近更新 更多