0

我有一个网络作业,它使用条件(DevliverCount = 1)只处理一次消息。因为如果第一个 webjob 的锁定时间过期,我不希望其他实例处理它。由于其他 webjob 在 locktime 过期后尝试处理消息,条件 (DevliverCount = 1) 将不满足并退出自动从队列中删除消息的方法。这里的问题是如果消息状态永远不会完成(除了成功)我不会在队列中处理消息。如何处理这种情况?

4

1 回答 1

0

我认为部分问题是您试图使用 MaxDeliveryCount 属性来防止并发消息处理:

MaxDeliveryCount

最大传递计数设置不用于防止多个消费者同时处理一条消息,它用于防止“毒消息”,即任何消费者尝试处理其内容阻止成功处理的消息,因此该消息将被永远处理。

我建议您准确确定您要完成的工作。如果您想要一个简单的竞争消费者场景,其中多个 Web 作业使用来自单个队列的消息,那么有标准方法可以实现:

对竞争消费者的良好描述

与服务总线队列竞争的消费者

您可以将 MaxDeliveryCount 与竞争消费者一起使用...如果您想防止有害消息,您可以将 MaxDeliveryCount 设置为大于 1 的值,并且仍然让其他消费者有机会处理锁定过期的消息。

Azure 服务总线支持超过最大传递计数的有害消息的死信,因此您可以离线检查此类消息......它们不会被简单地永久删除。

您可能还需要在 webjobs 中添加代码以在锁定到期之前更新锁定......否则服务总线无法区分“需要很长时间处理的有效消息”和“无法处理的毒消息” ”。如果没有锁更新,您长期运行的有效消息将像毒消息一样被死信,这几乎肯定不是您想要的。

祝你好运!

于 2016-05-11T14:45:22.967 回答