【问题标题】:Masstransit EndpointConvention Azure Service BusMasstransit EndpointConvention Azure 服务总线
【发布时间】:2020-07-03 10:45:21
【问题描述】:

我想知道我是不是做错了什么,我预计MassTransit 会自动在EndpointConvention 中注册ReceiveEndpoints

示例代码:

services.AddMassTransit(x =>
{
    x.AddServiceBusMessageScheduler();
    x.AddConsumersFromNamespaceContaining<MyNamespace.MyRequestConsumer>();
    x.UsingAzureServiceBus((context, cfg) =>
    {
        // Load the connection string from the configuration.
        cfg.Host(context.GetRequiredService<IConfiguration>().GetValue<string>("ServiceBus:ConnectionString"));
        cfg.UseServiceBusMessageScheduler();

        // Without this line I'm getting an error complaining about no endpoint convention for x could be found.
        EndpointConvention.Map<MyRequest>(new Uri("queue:queue-name"));

        cfg.ReceiveEndpoint("queue-name", e =>
        {
            e.MaxConcurrentCalls = 1;
            e.ConfigureConsumer<MyRequestConsumer>(context);
        });

        cfg.ConfigureEndpoints(context);
    });
});

我认为这条线 EndpointConvention.Map&lt;MyRequest&gt;(new Uri("queue:queue-name")); 在不指定队列名称的情况下允许发送到总线是不必要的,还是我遗漏了什么?

await bus.Send&lt;MyRequest&gt;(new { ...});

【问题讨论】:

    标签: masstransit


    【解决方案1】:

    EndpointConvention 是一种方便的方法,允许在不指定端点地址的情况下使用 Send。 MassTransit 中没有任何东西会自动配置它,因为坦率地说,我不使用它。而且我认为其他人也不应该这样做。也就是说,人们确实出于任何原因使用它。

    首先,考虑后果 - 如果每种消息类型都注册为端点约定,那么在多个端点上发布和使用的消息呢?那是行不通的。

    因此,如果您想按消息类型路由消息,MassTransit 有一个功能。它叫做Publish,效果很好。

    但是等等,这是一个命令,命令应该是发送

    确实如此,但是,如果您可以控制应用程序并且您知道代码库中只有一个消费者使用 KickTheTiresAndLightTheFires 消息合约,那么发布与发送一样好,而您没有需要知道地址!

    不,老兄,我想使用 Send!

    好的,好的,这是详细信息。使用 ConfigureEndpoints() 时,MassTransit 使用 IEndpointNameFormatter 根据通过 AddConsumerAddSagaStateMachine 等注册的类型生成接收端点队列名称,如果您使用相同的接口注册您自己的端点约定想要使用发送而不指定目标地址。

    当然,您需要将消费者和消息类型的知识结合起来,但这是您的决定。您已经在处理魔法(通过使用没有明确目的地的发送),为什么不正确呢?

    string queueName = formatter.Consumer<T>()
    

    将该字符串用于该消费者中的消息类型作为$"queue:{queueName}" 地址并将其注册到 EndpointConvention。

    或者,您知道,只需使用 Publish

    【讨论】:

    • 所以要正确理解,即使它是一个命令,如果我们在哪里使用Publish 而不是Send 消费者可以保持不变并自动处理消息?但我们不必在发布者端(单独的网站)指定端点约定
    • 正确,如果您有一个消息类型的消费者并发布,则无需知道地址即可进行 1:1 对话。消息将通过一个主题路由到接收端点,并在那里被使用。
    • @ChrisPatterson 很抱歉挖掘了这个,但我觉得Publish 需要一些 额外配置。如果我添加消费者,但不注册接收端点,则消息永远不会被消费......
    • 我有点困惑,因为你的官方文档说“不要将发布用于命令”>> masstransit-project.com/usage/messages.html#message-names
    • 好吧,在这种情况下文档是错误的。
    猜你喜欢
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多