Azure Service Bus Queue 如何保证最多一次交付?

How does Azure Service Bus Queue guarantees at most once delivery?

据此doc 服务总线支持两种模式 Receive-and-Delete 和 Peek-Lock。

如果使用 Peek-Lock 模式,如果消费者 crashes/hangs/do 在处理消息后立即进行了很长的 GC,但在 messageId 为 "Completed" 且可见性时间到期之前,同一消息有可能是交付了两次。

那微软怎么说Service Bus supports at most once delivery mode。是不是因为 Receive-and-Delete 模式只发送消息 once.But 再一次,如果消费者在处理消息时发生了什么事情,那么有价值的信息就会丢失。

如果是,那么使用 Azure 服务总线作为队列并使用 Azure 函数作为消费者来确保准确一次交付的最佳方法是什么。

P.S。我能想到的一种方法是将 MessageID 存储在 blob 中,但由于在我的情况下 MessageID 的数量可能非常大,因此存储和加载所有这些并不是正确的方法。

Azure Functions 将始终以 Peek-Lock 模式使用服务总线消息。在一般情况下,Exactly Once 传递基本上是不可能的:消费应用程序总是有可能在完成消息之前在错误的时间崩溃,然后消息将被重新传递。

您应该努力实施 Effectively Once 处理。这通常使用幂等消息处理器来实现。

存储 MessageID(消费者端重复数据删除)是一种选择。您可以制定清理旧消息 ID 的策略,以保持此类存储的大小可管理。为了使这 100% 可靠,您必须将消息 ID 存储在与处理器完成的其他修改相同的事务中。

其他选项实际上取决于您的处理方案。找到一种使其幂等的方法 - 以便多次处理同一条消息在功能上与只处理一次相同。