我们有两个长时间运行的 saga,它们都运行了无限时间并响应超时。第一个每 15 分钟订阅一次超时,第二个每 24 小时订阅一次。每个 saga 都会跟踪自己的执行时间,并在开始运行和完成时通知其他 saga。由于数据库争用,这些 saga 负责的批量数据加载无法同时运行。
当第一个 saga ( Saga A
- 15 min) 开始时,它首先检查(使用内部变量)以查看第二个 saga ( Saga B
- 24 hr) 当前是否正在运行。如果不是,它开始它的处理步骤(脱壳到另一个进程,并随着时间的推移轮询它以查看它何时完成)。这两个 sagas 通过发送消息进行通信,以便在它们启动或完成时相互通知。
出于某种原因,这在两个层面上对我来说似乎很臭:
- 我们基本上有一个永远不会完成的单例传奇。这本身就是一种反模式吗?
- 我们双向发送消息的唯一目的是修改状态。似乎应该有更好的方法来处理这种情况。随着 NSB 4.0 的发布,我们开始在执行
sending
命令时遇到错误。当我们改用 pub-sub 方法时,错误就被清除了。
这是否被认为是 NServiceBus 实现反模式,对于这种需求是否有更好的模式?