是否应该使用sagas来保持处理程序的执行进度



我有一个处理程序,它的工作是获取一个对象列表,并为该对象列表中的每个项目发布一个事件。这可能看起来像下面的代码:

Handle(PublishListMessage message) {
foreach(var entry in message.List) {
Bus.Publish(entry);
}
}

我的用例是我期望消息。列表计数非常好,因此foreach循环可能需要一些时间。

因此,假设我已经处理了100个入口对象中的50个,然后是Bus。由于某些原因,发布(条目)失败。处理程序将根据我的重试策略重试,但是,它现在将从头开始处理所有100个条目。

这并不理想,所以我想在某个地方坚持进步。由于我使用MongoDB作为持久层,我想我可以将我的处理程序封装在Saga中。Saga将跟踪所有已处理的条目,希望如果处理程序失败,它将重试,并检索Saga,记录它之前取得的进展。

然而,我的快速测试让我假设,在处理程序完成执行之前,Saga不会提交(在本例中是提交给MongoDB)。所以对于我的用例来说,这是没有帮助的。

我的主要问题是,我是否可以在处理程序运行完成之前的某个时刻将Saga提交到DB。这给了我《传奇》的一些其他好处,而我不必在每一篇作品都被送去出版后写下自己的坚持。

我的第二个问题是,如果这确实是可能的,我应该在这个特定的例子中这样做吗?这是对佐贺的有效使用还是一种合适的替代方法?

为什么要使用总线。发布失败?只有当您的传输端口发生故障时,才会发生这种情况,但在这种情况下,NServiceBus会将断路器设置为待命状态,整个端点将很快关闭。在这种情况下,我会为整个基础设施关闭做好准备,而不是在一些数据库上回复以保持您的进度状态。我看不出传奇对你有什么帮助。如果您真的不信任NServiceBus作为简单发布的基础结构组件,那么您可以将循环状态保存在简单消息处理程序中,使用与传奇故事相同的标识符。例如,这可能是相关id。没有什么可以阻止您在消息处理程序中执行数据库操作,您不需要为此付出任何代价。

相关内容

最新更新