普通消费者可以在 MassTransit 中重试消息之前延长超时时间吗?

Posted

技术标签:

【中文标题】普通消费者可以在 MassTransit 中重试消息之前延长超时时间吗?【英文标题】:Can a regular consumer extended the timeout before retrying the message in MassTransit? 【发布时间】:2022-01-12 05:45:41 【问题描述】:

目前,我处于一个事件需要更新数据库中一定数量的记录的情况。通常,这不会超过几秒钟,但在某些情况下可能需要超过 1 分钟。在这种情况下,消费者会在 30 秒后获取相同的消息并重试。

我想知道是否可以在不使用 JobConsumers 的情况下为那些罕见的场景增加等待时间最多 5 分钟。

【问题讨论】:

可以参考MassTransit - Retry和UseRetry set interval with MassTransit 事情是没有失败。消费者正在处理,然后在处理 30 秒后再次发送消息 【参考方案1】:

您是否在接收端点上配置LockTimeout 30 秒? MassTransit 默认为 5 分钟,但如果队列已具有较低的配置锁定超时,Azure 服务总线将仅在重新传递消息之前等待该时间段。如果队列已经存在,您需要使用 Azure 门户更新队列属性,或删除队列以便 MassTransit 重新创建它(任何消息都会丢失)。

您也可以将MaxDeliveryCount 设置为1,Azure 会在一次尝试后将消息移动到死信队列。不过第一种方法更好。

【讨论】:

感谢您的回复。我正在尝试第一种方法:busFactoryConfig.SubscriptionEndpoint<CustomerModified>(SubscriptionName, (configurator) => configurator.LockDuration = TimeSpan.FromMinutes(5); configurator.MaxAutoRenewDuration = TimeSpan.FromMinutes(30); configurator.ConfigureConsumer<CustomerModifiedConsumer>(context); ); 默认设置为 30 秒,我没有更改任何配置,现在订阅设置为 5 分钟。看起来这成功了

以上是关于普通消费者可以在 MassTransit 中重试消息之前延长超时时间吗?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 MassTransit 为 RabbitMQ 队列注册多个消费者?

在循环中重试死锁,它们最终会解决吗?

masstransit请求/响应:在消费者中获取调用者超时

MassTransit:在消费者消费完所有消息后如何停止公共汽车?

在 vuejs 中重试失败的 ajax 请求

在 Java 中重试 JDBC 连接