Azure服务总线队列如何保证最多一次交付?

him*_*219 2 message-queue azure azureservicebus azure-servicebus-queues

根据此文档,服务总线支持两种模式:接收并删除和窥视锁定。

如果使用 Peek-Lock 模式,如果消费者在处理消息后立即崩溃/挂起/执行很长的 GC,但在 messageId 为“已完成”并且可见性时间到期之前,有可能会两次传递同一条消息。

那么微软是怎么说Service Bus支持最多一次交付模式的呢?是因为接收并删除模式只发送一次消息吗?但是话又说回来,如果消费者在处理消息时发生了某些事情,那么有价值的信息就会丢失。

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

PS 我能想到的一种方法是将 MessageID 存储在 blob 中,但在我的情况下,MessageID 的数量可能非常大,存储和加载所有消息并不是正确的方法。

Mik*_*kov 7

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

您应该努力实施有效一次处理。这通常是通过幂等消息处理器来实现的。

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

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