NServiceBus 发件箱仅处理一次

问题描述 投票:0回答:1

阅读文档,它说:

'...
由于可能出现故障,给定消息可能会被发送多次。例如,如果在步骤 3 中引发异常(更新发件箱存储失败),则将再次从发件箱存储中读取消息并再次发送。 只要接收端点使用发件箱功能,这些重复项将通过第 1 阶段第 2 步中的重复数据删除处理。
...'

我想知道当传输是rabbitmq并且发件箱持久性是sql server时,这个重复数据删除阶段到底是如何工作的。这两者之间不可能有事务,所以一旦你成功处理了你的rabbitmq消息,在我看来,sql server调用更新发件箱作为“消息传递到队列”仍然可能失败,导致处理rabbitmq消息在接收端点上多次发送,以防发送端点同时再次发送?

我觉得我犯了一个推理错误,因为我不完全理解它是如何工作的。

有什么见解吗?

nservicebus outbox-pattern transactional-outbox
1个回答
0
投票

是的,设置 Dispatched = true 的 SQL 调用仍然可能失败,然后 RabbitMQ 消息将被再次处理。但是下次处理它时,在调用消息处理程序之前,它会看到消息处理程序已经成功调用,并且上次的结果已提交到数据库,因此它将跳过消息处理程序并继续直接进入调度阶段。

因此,即使 SQL Server 存在一个奇怪的问题,即由于无法在该表上设置 Dispatched 而创建了 100 个重复项,运行重复数据删除的接收端点也会收到所有 100 条消息,但在第一个消息出现后“看到了,看到了,看到了,看到了……”

© www.soinside.com 2019 - 2024. All rights reserved.