简单的 Azure 功能失败:更改非并发集合的操作必须具有独占访问权限

问题描述 投票:0回答:1

我们有一个 Azure 函数,其唯一目的是将消息从 Azure APIM 发送到 Azure 事件中心。

流程是:APIM -> Azure Function -> eventhub

Azure 函数中的代码很少:

#r "Newtonsoft.Json"
#r "Microsoft.Azure.WebJobs.Extensions.Http"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.Http;


public static async Task<IActionResult> Run(HttpRequest req, ILogger log, IAsyncCollector<string> outputEventHub2)
{
    string message = await req.ReadAsStringAsync();
    await outputEventHub2.AddAsync(message);
    return new OkResult();
}

APIM 定期触发。有时,我们会看到出现以下错误,并且此后该功能停止工作:

更改非并发集合的操作必须具有独占性 使用权。对此集合执行了并发更新,并且 破坏了它的状态。集合的状态不再正确。

从那时起,对 Azure 函数的所有连续调用都会失败 (404)。直接调用函数 URL 的事件会返回此响应。

重新启动 Azure 功能可以在不可预测的时间内修复问题。

尝试在不同的环境中重现它,但到目前为止还没有运气。完全相同的代码在不同的环境中运行超过一年没有任何问题。

所使用的任何库中是否存在一些已知的线程安全问题?

用简单的 Azure 逻辑应用程序替换此功能可以解决问题吗?

azure function azure-functions thread-safety
1个回答
0
投票

用简单的 Azure 逻辑应用程序替换此功能可以解决问题吗?

Azure Functions 与逻辑应用程序的组合存在类似的错误/问题,如本Microsoft 问答主题中所示。

完全相同的代码在不同的环境中运行超过一年没有任何问题。

这是 ChristianSchreuder-4912 在他的问题中所做的解决方法。

现在默认情况下,如果返回错误,逻辑应用程序将自动重试;但是,当这 3 个函数无法加载时,逻辑应用程序会收到 404 错误,这显然不会触发自动重试,并且逻辑应用程序会失败。 还应该注意的是,在任何启动后的 5 分钟运行期间,由于第二个预热周期,所有 6 个功能都按预期工作。

这表明 Function App 本身存在问题。 我尝试使用新的函数应用程序和逻辑应用程序重现该错误,该应用程序每 2 小时运行一次,并且在过去 3 天内没有出现任何故障。所有功能始终在第一次时正确加载。

我将在新的 Function App 中重新部署这些函数,看看问题是否仍然存在,但我怀疑问题是否仍然存在,因为这个特定的 Function App 似乎已损坏。

我建议重新创建/重置环境,构建并尝试执行它的同一段函数代码可能会起作用。

© www.soinside.com 2019 - 2024. All rights reserved.