You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MassTransit高频调用GetSendEndpoint是否可行及MaxDeliveryCount有效性咨询

关于MassTransit高频消息发送的两个问题

我有一个生产者,每分钟向特定端点发送1000多条消息。我使用Microsoft DI,并按照MassTransit官方文档中描述的方式配置了发送端点。

// Masstransit setup
serviceCollection.AddMassTransit(mt =>
{
    mt.UsingAzureServiceBus((ctx, cfg) =>
    {
        cfg.Host(massTransitSettings.TestServiceBusConnectionString);
        cfg.ReceiveEndpoint("mytestmessage", e =>
        {
            e.MaxDeliveryCount = 3; //How many times the transport will redeliver the message on negative acknowledgment
        });
    });
});
serviceCollection.AddTransient<ITestMessageProducer, TestMessageProducer>();

// Producer setup
public class TestMessageProducer : ITestMessageProducer
{
    private readonly ISendEndpointProvider _testEndpoint;

    public TestMessageProducer(ISendEndpointProvider testEndpoint)
    {
        _testEndpoint = testEndpoint;
    }

    public async Task SendTestMessage(ITestMessage testmessage)
    {
        var endpoint = await _testEndpoint.GetSendEndpoint(new Uri("queue:mytestmessage"));
        await endpoint.Send(testmessage);
    }
}

问题

  • 问题1:SendTestMessage函数被高频调用,每次调用GetSendEndpoint是否可行?我曾看到资料称GetSendEndpoint每次都会创建新的ISendEndpoint实例。
  • 问题2:配置的MaxDeliveryCount对我的发送端点是否仍然生效?

解答

问题1解答

完全可行。MassTransit内部会对GetSendEndpoint返回的ISendEndpoint实例按URI做缓存,并非每次调用都创建新实例。即使每分钟调用上千次,内置缓存机制也能保证性能稳定,不会产生额外资源开销。如果想进一步优化,也可以在生产者初始化时提前获取一次端点并缓存到类成员中,后续发送直接复用,但不这么做也完全能应对当前的消息量。

问题2解答

配置的MaxDeliveryCount = 3是生效的,但要明确它的作用范围:这个参数是针对接收端点设置的,当消息被消费者处理失败并返回负确认(Nack)时,Azure Service Bus会按照该值限制重新投递的最大次数。它不会直接影响生产者的发送行为,但消息进入队列后,后续的投递逻辑会严格遵循这个配置。由于你配置的接收端点名称和发送的队列名称完全一致(都是"mytestmessage"),所以该设置会正常生效。


内容的提问来源于stack exchange,提问作者Molay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:45:29