如何防止Azure Web作业多次并发处理同一邮件 [英] How to prevent Azure webjob processing same message multiple times concurrently

查看:68
本文介绍了如何防止Azure Web作业多次并发处理同一邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Azure WebJob项目,我正在我的开发机器上本地运行该项目。它正在侦听Azure Service Bus消息队列。没有什么比主题更重要的了,只是最基本的消息队列。

它多次接收/处理同一邮件,在收到邮件时立即启动两次,然后在处理邮件时间歇性启动两次。

问题:

  • 为什么我会立即多次收到相同的消息?在应用PeekLock之前似乎正在重新获取?
  • 为什么在仍在处理中的情况下仍在重新接收消息?我是否可以设置PeekLock持续时间,或者以某种方式将邮件锁定为只处理一次
  • 如何确保队列中的每封邮件只处理一次?
  • 我希望能够一次处理多条消息,但不是多次处理同一条消息,因此将MaxConCurentCalls设置为1似乎不是我的答案,或者我误解了该属性?

我使用的是一个异步函数、简单的注入器和一个定制的JobActivator,所以我的函数签名是:

,而不是静态的空方法
public async Task ProcessQueueMessage([ServiceBusTrigger("AnyQueue")] MediaEncoderQueueItem message, TextWriter log) {...}
在作业内部,它在BLOB服务上移动一些文件,并从媒体服务调用(并等待)媒体编码器。因此,虽然Web作业本身不会进行大量处理,但它需要相当长的时间(对于某些文件,需要15分钟)。

应用程序正在启动,当我向队列发布消息时,它会响应。但是,一旦收到消息,它就会多次收到消息:

Executing: 'Functions.ProcessQueueMessage' - Reason: 'New ServiceBus message detected on 'MyQueue'.'
Executing: 'Functions.ProcessQueueMessage' - Reason: 'New ServiceBus message detected on 'MyQueue'.'

此外,在任务运行期间(我可以看到媒体服务功能的输出),它将从队列中获得另一个"副本"。

最后,在任务完成后,它仍然间歇性地处理相同的消息。

推荐答案

我怀疑发生的情况如下: 最大DurationLock可以是5分钟。如果消息的处理在5分钟内完成,则消息被标记为已完成并从代理中删除。否则,如果处理时间超过5分钟,消息将重新出现(我们失去了对消息的锁定),并将再次使用。您可以通过查看消息的DeliveryCount来验证这一点。

若要解决此问题,您可以使用BrokeredMessage.RenewLockAsync()在即将到期之前续订消息锁定。

这篇关于如何防止Azure Web作业多次并发处理同一邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆