Azure 服务总线 - 锁定持续时间和重复,它们有什么关系?

Azure service bus - lock duration and duplication, how are they related?

我有一个 azure 函数监视 Azure 服务总线队列,默认锁定持续时间为 30 秒。此 azure 函数根据来自队列的消息中的用户信息发送电子邮件通知。

我注意到发出了重复的电子邮件,因此检查了跟踪日志,发现已为同一用户调用了两次 azure 函数。日志条目如下:

2018-08-09T14:38:05.1249371Z - 正在执行 'AzureFunction'(原因='在 [= 上检测到新的 ServiceBus 消息29=].', Id=4657012a-94ac-4b22-a628-2e94285aeeb7)

2018-08-09T14:38:33.3335833Z - 正在执行 'AzureFunction'(原因='在 [= 上检测到新的 ServiceBus 消息29=].', Id=3ff8eea3-9b9b-43ae-a797-5acf01c2ae6c)

该消息只被添加到队列中一次,我正在尝试了解什么可以生成另一条消息。会不会是因为锁定时间?

消息只添加了一次,但 at-least-once PeekLock 的交付保证。 如果您的消息在接收后 30 秒内未成功完成,它将被解锁并再次接收。增加锁定持续时间或减少处理时间应该可以解决这个问题。

是的,这可能是由于锁定时间。只有在函数执行完成后,消息才会从队列中完成(接收和删除)。如果执行时间超过 30 秒,消息将被解锁,使其可供任何其他接收者使用。

在您的情况下,接收方将是同一个 Azure Function,它会在另一次读取消息,这就是您看到消息重复处理的原因。

Lock Duration 的最大值为 5 分钟。如果 Azure Functions 只是在收到消息时发送电子邮件通知,则可以将锁定持续时间增加到 5 分钟。电子邮件传输时间不应太长,否则其他收件人将无法收到该邮件。

如果您计划在发送通知之外向 Azure Function 添加一些内容,您可以在 Azure Function 中为锁设置自动续订,查看 here 了解更多详情。这将使消息保持锁定状态,不留任何复制选项。