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
相关产品推荐
相关产品推荐

