首页 > 解决方案 > 是否可以在不使用调用 MarkAsComplete 的长时间超时的情况下为 Saga 设置 TTL?

问题描述

现在我们完成了从业务角度来看成功的 saga,但我们将失败的 saga 存储了 3 个月——我们设置了超时,然后将 saga 标记为已完成。

是否有更通用的方法来设置不涉及底层消息服务的 saga 的生存时间?

例如,AWS SQS 的最大延迟为 15 分钟,但对我们来说,每周运行一次垃圾收集作业就足够了。NSB有这个选项吗?

标签: nservicebus

解决方案


是否有更通用的方法来设置不涉及底层消息服务的 saga 的生存时间?

NServiceBus 使用延迟消息实现超时。SQS 恰好被限制为最多 15 分钟。为了克服这个限制,传输多次重新调度消息以获得所需的延迟。Azure 服务总线、RabbitMQ、SQL Server 传输等其他传输不需要这样做,因为它们可以在必要的时间内发送一条延迟消息。RabbitMQ 本身也不支持它,因此它也在内部实现了该功能。没有“通用”实现。它始终特定于您使用的传输方式。

这正是 NServiceBus 通过使用延迟交付所做的事情。不幸的是,您注意到的 SQS 不支持超过 15 分钟的时间段。

您可以使用 3rd 方调度库,该库将发送一条完成传奇的消息。https://docs.particular.net/nservicebus/scheduling/

我也会在内部跟进,看看是否有其他建议。


推荐阅读