NServiceBus"发送原子与接收"还需要Outbox来进行重复数据删除吗?

时间:2017-04-12 11:42:53

标签: transactions nservicebus

使用sends-atomic-with-receive的传输事务模式可以避免在处理程序因某种原因失败时在传入消息(命令或事件)的处理程序中发送消息。 NServiceBus的Outbox功能避免多次处理相同的传入消息,从而避免必须编写幂等处理程序。我的问题是:是否消除了对方的需要?在使用sends-atomic-with-receive时,使用发件箱确保传入消息的重复数据删除仍然有用吗?

1 个答案:

答案 0 :(得分:1)

使用receive发送原子确保ghost消息没有真正的机会,只适用于传输。

在此模式下,仍然可能会多次处理邮件。

如果消息的处理成功,现在传输提交其事务并且失败。现在将再次处理您的消息,以便再次完成数据库更改,但不会发送重影消息。

如果您想要阻止再次进行数据库更改,那么如果该更改不是幂等的,则仍需要发件箱。

另请注意,发件箱仅执行事务处理处理,它不进行重复数据删除,但由于事务处理,只有一个事务可以插入已处理消息的唯一消息标识这间接导致重复数据删除行为。

如果您的资源不是交易资源,则仍需要使您的信息处理具有幂等性。如果您访问的资源没有使用与发件箱相同的存储上下文,并且不允许或不支持这些存储资源之间的分布式事务,则仍然需要这样做。

文档: