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

时间:2018-06-22 14:00:31

标签: azure message-queue azureservicebus azure-servicebus-queues

根据此doc服务总线,支持接收和删除以及窥视锁定两种模式。

如果使用Peek-Lock模式,如果使用者在处理完消息之后,但在messageId被“完成”且可见性时间到期之前,使用者崩溃/挂起/执行了很长的GC,则有可能两次发送相同的消息。

然后Microsoft如何说Service Bus最多支持一次交付模式。是因为“接收和删除”模式仅发送一次消息。但是,如果消费者在处理消息时发生某些情况,那么有价值的信息就会丢失。

如果是,那么使用Azure Services Bus作为队列并以Azure Functions作为使用者确保一次准确交付的最佳方法是什么。

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

1 个答案:

答案 0 :(得分:1)

Azure功能将始终在Peek-Lock模式下使用服务总线消息。准确地说,通常在一般情况下无法完成传递:在完成消息之前,消费应用程序总是有可能在错误的时间崩溃,然后重新传递消息。

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

存储MessageID(消费者端重复数据删除)是一种选择。您可能具有清除旧消息ID的策略,以使此类存储的大小可管理。要使此ID 100%可靠,您必须将Message ID与处理器进行的其他修改存储在同一事务中。

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