NServiceBus "sends-atomic-with-receive" 仍然需要发件箱来进行消息去重?
NServiceBus "sends-atomic-with-receive" still needs the Outbox for message deduplication?
使用 sends-atomic-with-receive
的传输事务模式可避免在处理程序因某种原因失败时在传入消息(命令或事件)的处理程序中发送消息。 NServiceBus 的 Outbox
特性避免了多次处理相同的传入消息,从而避免了必须编写幂等处理程序。我的问题是:一个是否消除了对另一个的需要?它是,当使用 sends-atomic-with-receive
时,使用发件箱是否仍然有用以确保传入消息的重复数据删除?
通过接收发送原子确保没有真正的机会出现幽灵消息并且只适用于传输。
在此模式下,仍然可能会多次处理一条消息。
如果消息处理成功怎么办,现在传输提交了它的事务但失败了。现在将再次处理您的消息,因此您的数据库更改将再次完成,但没有发送任何幻影消息。
如果您想防止再次进行该数据库更改,如果该更改不是幂等的,您仍然需要发件箱。
另请注意,发件箱仅进行事务性精确一次处理,它不进行重复数据删除,但由于事务性处理,只有一个事务可以插入唯一的消息标识间接导致类似重复数据删除行为的已处理消息。
如果您的资源不是事务性的,您仍然需要使您的消息处理是幂等的。如果您正在访问的资源未使用与发件箱相同的存储上下文,并且不允许或不支持这些存储资源之间的分布式事务,这仍然是必需的。
文档:
使用 sends-atomic-with-receive
的传输事务模式可避免在处理程序因某种原因失败时在传入消息(命令或事件)的处理程序中发送消息。 NServiceBus 的 Outbox
特性避免了多次处理相同的传入消息,从而避免了必须编写幂等处理程序。我的问题是:一个是否消除了对另一个的需要?它是,当使用 sends-atomic-with-receive
时,使用发件箱是否仍然有用以确保传入消息的重复数据删除?
通过接收发送原子确保没有真正的机会出现幽灵消息并且只适用于传输。
在此模式下,仍然可能会多次处理一条消息。
如果消息处理成功怎么办,现在传输提交了它的事务但失败了。现在将再次处理您的消息,因此您的数据库更改将再次完成,但没有发送任何幻影消息。
如果您想防止再次进行该数据库更改,如果该更改不是幂等的,您仍然需要发件箱。
另请注意,发件箱仅进行事务性精确一次处理,它不进行重复数据删除,但由于事务性处理,只有一个事务可以插入唯一的消息标识间接导致类似重复数据删除行为的已处理消息。
如果您的资源不是事务性的,您仍然需要使您的消息处理是幂等的。如果您正在访问的资源未使用与发件箱相同的存储上下文,并且不允许或不支持这些存储资源之间的分布式事务,这仍然是必需的。
文档: