当前位置: 首页 > 知识库问答 >
问题:

Azure函数中的Cosmos DB 408响应

华宣
2023-03-14

我有一个Azure函数(v2),可以访问Cosmos DB,但不是通过绑定(我们需要使用自定义序列化设置)。我遵循了这里的示例来设置一个对象,该对象应可用于活动函数的所有实例。我的有点不同,因为我们的自定义<code>CosmosDb

public static class AnalyzeActivityTrigger
{
    private static readonly Lazy<Task<CosmosDb>> LazyCosmosDb = new Lazy<Task<CosmosDb>>(InitializeDocumentClient);
    private static Task<CosmosDb> CosmosDb => LazyCosmosDb.Value;

    private static Task<CosmosDb> InitializeDocumentClient()
    {
        return StorageFramework.CosmosDb.GetCosmosDb(DesignUtilities.Storage.CosmosDbContainerDefinitions, DesignUtilities.Storage.CosmosDbMigrations);
    }

    [FunctionName(nameof(AnalyzeActivityTrigger))]
    public static async Task<Guid> Run(
        [ActivityTrigger]DurableActivityContext context,
        ILogger log)
    {
        var analyzeActivityRequestString = context.GetInput<string>();
        var analyzeActivityRequest = StorageFramework.Storage.Deserialize<AnalyzeActivityRequest>(analyzeActivityRequestString);
        var componentDesign = StorageFramework.Storage.Deserialize<ComponentDesign>(analyzeActivityRequest.ComponentDesignString);

        var (analysisSet, _, _) = await AnalysisUtilities.AnalyzeComponentDesignAndUploadArtifacts(componentDesign,
            LogVariables.Off, new AnalysisLog(), Stopwatch.StartNew(), analyzeActivityRequest.CommitName, await CosmosDb);

        return analysisSet.AnalysisReport.Guid;
    }
}

我们扇出,并行调用此活动函数。我们的文档相当大,因此更新它们很昂贵,这是此代码的一部分。

我有时会在容器时收到此错误。ReplaceItemAsync 称为:

响应状态码不表示成功:408子状态:0原因:(消息:请求超时。...

显然要做的事情似乎是增加超时,但这是否表明存在其他问题?增加超时似乎是在解决症状,而不是问题。我们有代码可以在这一切发生之前扩展我们的RU。我想知道这是否与Azure函数扇形展开有关,这会给它带来太多的负载。所以我也在调整主机。durableTask的json设置,如maxConcurrentActivityFunctions,和maxConcurrent OrchestratorFunctions,但到目前为止无效。

我应该如何处理这个408错误?除了增加请求超时时间之外,我还可以考虑采取什么措施来缓解这种情况?

更新1:我将默认请求超时时间增加到5分钟,现在我得到了503个响应。

更新 2:指向发布到高级计划中的 Azure 函数的克隆似乎在经过多次测试后仍能正常工作。

更新3:我们对它的测试不够努力。该问题也出现在Premium计划中。GitHub问题即将发布。

更新4:我们似乎已经通过在连接到Cosmos时使用网关模式和增加RU来解决这个问题。

共有1个答案

南宫森
2023-03-14

超时确实可以表明有关实例资源的问题。参考:https://docs.microsoft.com/azure/cosmos-db/troubleshoot-dot-net-sdk#request-timeouts

如果在函数上运行,请查看连接。还要验证实例中的 CPU 使用情况。如果 CPU 很高,则可能会影响请求延迟并最终导致超时。

对于函数,你当然可以使用DI来避免整个懒惰声明:https://github . com/Azure/Azure-cosmos-dot net-v3/tree/master/Microsoft。Azure.Cosmos.Samples/Usage/AzureFunctions

使用以下内容创建< code>Startup.cs文件:

using System;
using Microsoft.Azure.Cosmos;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

[assembly: FunctionsStartup(typeof(YourNameSpace.Startup))]

namespace YourNameSpace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSingleton((s) => {
                CosmosClient cosmosClient = new CosmosClient("connection string");

                return cosmosClient;
            });
        }
    }
}

然后你可以让你的函数不是静态的并注入它:

public class AnalyzeActivityTrigger
{
    private readonly CosmosClient cosmosClient;
    public AnalyzeActivityTrigger(CosmosClient cosmosClient)
    {
        this.cosmosClient = cosmosClient;
    }

    [FunctionName(nameof(AnalyzeActivityTrigger))]
    public async Task<Guid> Run(
        [ActivityTrigger]DurableActivityContext context,
        ILogger log)
    {
        var analyzeActivityRequestString = context.GetInput<string>();
        var analyzeActivityRequest = StorageFramework.Storage.Deserialize<AnalyzeActivityRequest>(analyzeActivityRequestString);
        var componentDesign = StorageFramework.Storage.Deserialize<ComponentDesign>(analyzeActivityRequest.ComponentDesignString);

        var (analysisSet, _, _) = await AnalysisUtilities.AnalyzeComponentDesignAndUploadArtifacts(componentDesign,
            LogVariables.Off, new AnalysisLog(), Stopwatch.StartNew(), analyzeActivityRequest.CommitName, this.cosmosClient);

        return analysisSet.AnalysisReport.Guid;
    }
}
 类似资料:
  • 有人能告诉我如何从Java中的HTTP触发器Azure函数发送pdf响应吗。 一旦该功能被触发,我需要从Azure存储中读取pdf,并将pdf作为响应返回到浏览器。

  • 我正在使用Azure函数V1 c#。我有一个时间触发的azure函数,它每秒都在检查我的数据库中的一些数据。如果找到了数据,我想对它执行一些操作。此操作可能需要30秒到5分钟的时间,具体取决于其上发生的操作。 > 当我的时间触发函数获取数据并开始对其执行操作时。在第一个操作完成之前,时间触发的函数不会再次执行。因此,即使时间触发函数被安排为每秒执行一次,如果上一次迭代中的操作花费了 30 秒,则在

  • 我有一个时间触发的Azure功能

  • 我在学习http://martinabbott.azurewebsites.net/2016/06/11/fun-with-azure-functions-and-the-emotion-api/ 我在集成选项卡中有名为“图片”的Blob触发器存储容器。myblob路径是“图片/{名称}”没有定义输入。输出是DocumentDB。我已经验证访问密钥是正确的。 我想知道错误的原因是什么?与 Azur

  • 我目前正在Visual Studio中使用微软的Azure函数开发一个函数应用程序。我能够在azure上部署和发布功能,它似乎可以运行,但每当我试图在本地运行功能时,托管环境都无法找到任何“作业”。我在下面附上了一张图片。 必须指出的是,我在某个时候能够在本地部署,但我相信在一些更新之后,我无法运行我的功能 Azure函数和Web作业工具的当前版本:15.0.40424.0 当我创建新项目时,我尝

  • 我在更新react native和react后出现此错误 我认为这是正确的语法,但我不知道为什么显示这个错误: SyntaxError:导出时出现意外标记= 。在模块上运行InthisContext(vm.js:53:16) _在对象上编译(module.js:387:25) 。模块_扩展。。js(module.js:422:10) 在模块中。在函数处加载(module.js:357:32) 。模