我有一个Azure功能监视Azure服务总线队列,默认锁定持续时间为30秒。这项天蓝色的功能根据来自队列的消息中的用户信息发送电子邮件通知。
我注意到有重复的电子邮件出去,因此检查了跟踪日志,以发现同一用户已两次调用了azure函数。日志条目如下:
2018-08-09T 14:38:05 .1249371Z-执行'AzureFunction'(原因='在'servicebusqueue'上检测到新的ServiceBus消息。',ID = 4657012a-94ac -4b22-a628-2e94285aeeb7)
2018-08-09 T14:38:33 .3335833Z-执行'AzureFunction'(原因='在'servicebusqueue'上检测到新的ServiceBus消息。',ID = 3ff8eea3-9b9b -43ae-a797-5acf01c2ae6c)
该消息仅添加到队列一次,我试图了解是什么导致了另一个消息。可能是因为锁定时间长吗?
答案 0 :(得分:6)
是的,可能是由于锁定持续时间所致。仅在功能执行完成后,消息才会从队列中完成(接收和删除)。如果执行时间超过30秒,则该消息将被解锁,使其可用于任何其他接收者。
在您的情况下,接收方将是相同的Azure函数,它将再次读取消息,这就是为什么您看到消息的重复处理的原因。
“锁定持续时间”的最大值为5分钟。如果Azure功能仅在收到消息时发送电子邮件通知,则可以将锁定持续时间增加到5分钟。电子邮件的传输时间不宜过长,因此该消息将无法用于其他收件人。
如果除发送通知外,还计划向Azure功能添加一些内容,则可以为Azure Function中的锁定设置自动续订,请检查here以获取更多详细信息。这将使邮件保持锁定状态,不留重复选项。
答案 1 :(得分:1)
邮件仅添加一次,但它是at-least-once
的{{1}}传递保证。
如果您的邮件在收到后30秒内未成功完成,它将被解锁并再次接收。增加锁定时间或减少处理时间应该可以解决这个问题。