关于MassTransit ConfigureBatchPublish功能及重复批次问题咨询
核心误区:ConfigureBatchPublish仅作用于消息发布(Publish)
ConfigureBatchPublish是专门为IPublishEndpoint.Publish操作设计的批量缓冲机制,对ISendEndpoint.Send或ISendEndpoint.SendBatch完全无效。这是你遇到第一个问题的根本原因:用ISendEndpoint.Send时,配置的批量规则根本不会生效,消息自然会逐条发送。
为什么Publish时每条消息都等待100毫秒?
你采用逐个await Publish的方式发送消息,每条消息的发送间隔会超过配置的100ms超时时间。此时MassTransit的批量缓冲逻辑会触发超时条件,直接发送当前缓冲的单条消息,并且会等待到超时时间结束才完成发送——这就是每条消息都等待100ms的原因。
如果想要触发批量发送,需要在短于100ms的时间窗口内连续发起100条Publish请求,比如不逐条await,而是先收集所有Publish任务再统一等待:
var tasks = new List<Task>(); for (int i = 0; i < 1000; i++) { tasks.Add(_publishEndpoint.Publish(new YourMessage(i))); } await Task.WhenAll(tasks);
这样缓冲就能在超时前凑够100条消息,批量发送到RabbitMQ。
SendBatch重复发送的原因
你遇到的重复发送现象,大概率是代码逻辑问题:如果在循环调用SendBatch时,没有每次创建新的消息集合,而是持续往同一个集合中添加新消息,那么每次调用SendBatch都会发送集合中所有的历史消息,就会出现第一批100条、第二批200条的情况。
另外,如果你想要对Send操作启用自动批量,需要使用ConfigureSendBatch配置(而非ConfigureBatchPublish),示例如下:
h.ConfigureSendBatch(cfg => { cfg.Enabled = true; cfg.MessageLimit = 100; cfg.Timeout = TimeSpan.FromMilliseconds(100); cfg.SizeLimit = 1024; });
配置后,使用ISendEndpoint.Send逐条发送时,会自动触发批量缓冲;此时不要手动调用SendBatch,否则会导致双重批量逻辑冲突。
内容的提问来源于stack exchange,提问作者Vlad

