Azure 中跨 webjob 实例的变量值范围

Scope of Variable values across webjob instance in Azure

我有一个服务总线队列被网络作业监听。由于我们希望更快地处理请求,因此我们增加了 Web 作业实例(比如 3)。但是当处理出现任何错误时,我们不想从队列中挑选其他消息。为了实现这一点,我们将一个变量设置为 0。我的疑问是,这个变量的值是在所有实例中都为 0 还是该值是特定于实例的。

代码是这样的...

int webJobStatus = 1;

while(webJobStatus == 1)
{
    try
    { 
       //processing....
    }
    catch(Exception ex)
    {
       webJobStatus = 1; // in case of exception, value is set as 0.
    } 
}

是的,WebJob 的每个实例都有自己的实例,因此有自己的 webJobStatus 值。这意味着在特定实例中设置 webJobStatus 只会停止该特定实例的处理,而不会停止其他实例的处理。

可能的解决方案
让所有实例都响应这样一个值的一种可能的解决方案是研究在数据库、Azure 存储或类似的东西中使用 semaphore 之类的东西。这样您就可以集中控制 WebJob 流的值。
请记住,这会降低性能。

我的两毛钱
发生异常时不要完全停止处理消息。由于您正在为云构建,因此 发生异常。资源可能(非常)暂时不可用,消息可能包含不正确的数据,所有这些都可能导致问题。考虑将遥测和日志记录添加到您的 Web 作业 (Application Insights) 以帮助快速查找和修复问题。通过启用 dead-letter 队列,当处理消息多次失败(默认:10)时,它将被放入 dead-letter 队列。将其用作解决任何问题和重新处理失败消息的基础。
另见:Poison message handling and Overview of Service Bus dead-letter queues

顺便说一句
我猜 catch 块中的赋值应该是 webJobStatus = 0;.