排查 Azure Functions 持久任务计划程序问题(预览版)

注释

Microsoft支持工程师可以帮助诊断您的应用程序问题。 如果在完成本文后无法诊断问题,可以通过在 Azure 门户上转到持久任务计划程序资源的 “帮助>支持 + 故障排除 ”部分来提交支持票证。

检查连接字符串和对持久任务计划程序的访问权限

当应用未按预期运行时,首先检查是否有:

  • 正确的连接字符串格式。
  • 身份验证设置正确。

本地开发

  1. 检查应采用以下格式的连接字符串: Endpoint=http://localhost:<port number>;Authentication=None。 确保端口号映射到8080上的

  2. 除了持久任务计划程序模拟器外,请确保 启动 Azure 存储模拟器 Azurite。 与 Functions 相关的应用组件需要 Azurite。

在 Azure 上运行

  1. 检查应用是否有环境变量 DURABLE_TASK_SCHEDULER_CONNECTION_STRINGTASKHUB_NAME

  2. 检查 DURABLE_TASK_SCHEDULER_CONNECTION_STRING 的值。 具体而言,请验证计划程序终结点和身份验证类型是否正确。 使用时,连接字符串的格式应如下:

    • 用户分配的托管标识Endpoint={scheduler endpoint};Authentication=ManagedIdentity;ClientID={client id} 其中 client id 是该标识的客户端 ID。
    • 系统分配的托管标识Endpoint={scheduler endpoint};Authentication=ManagedIdentity
  3. 对于需要访问指定任务中心或计划程序的标识,确保已将所需的基于角色的访问控制 (RBAC) 权限授予给标识

  4. 如果使用用户分配的托管标识,请确保 将标识分配给应用

将 Durable Functions 应用部署到 Azure 时出错

如果部署失败并出现来自 Visual Studio Code 的错误 Encountered an error (ServiceUnavailable) from host runtime ,请先检查应用以确保正确设置所需的 环境变量 。 然后重新部署应用。 如果看到加载函数时出错,请单击“刷新”按钮。

无法检索此任务中心详细信息,发生未知错误

如果在持久任务计划程序仪表板上出现 Unknown error retrieving details of this task hub 错误,原因可能是:

  1. 你的标识(电子邮件)不具有为此任务中心分配的所需权限。 按照说明 授予权限,然后再次访问控制面板。

  2. 任务中心已删除。

无法删除资源

请确保删除持久任务计划程序环境中的所有任务中心。 如果没有收到,你会得到以下错误消息:

{
  "error": {
    "code": "CannotDeleteResource",
    "message": "Cannot delete resource while nested resources exist. Some existing nested resource IDs include: 'Microsoft.DurableTask/schedulers/YOUR_SCHEDULER/taskhubs/YOUR_TASKHUB'. Please delete all nested resources before deleting this resource."
  }
}

无法确定要生成的项目

如果在启动 Azurite 后遇到以下错误: “Can't determine Project to build. Expected 1 .csproj or .fsproj but found 2”

  • 删除应用中的 binobj 目录。
  • 请尝试再次运行 func start

找不到适用于 ARM 的本地二进制文件

如果你看到与找不到 ARM 的本机二进制文件相关的 gRPC 错误(例如在 Mx Mac 上),可能需要将以下解决方法添加到 extensions.csproj 文件的末尾。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <WarningsAsErrors></WarningsAsErrors>
    <DefaultItemExcludes>**</DefaultItemExcludes>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="2.13.7" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask.AzureManaged" Version="0.3.0-alpha" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator" Version="1.1.3" />
  </ItemGroup>
  <!-- Add the below groups/targets to workaround gRPC issues on ARM devices. -->  
  <ItemGroup>
    <PackageReference Include="Contrib.Grpc.Core.M1" Version="2.41.0" />
  </ItemGroup>
  <Target Name="CopyGrpcNativeAssetsToOutDir" AfterTargets="Build">
    <ItemGroup>
       <NativeAssetToCopy Condition="$([MSBuild]::IsOSPlatform('OSX'))" Include="$(OutDir)runtimes/osx-arm64/native/*"/>
    </ItemGroup>
    <Copy SourceFiles="@(NativeAssetToCopy)" DestinationFolder="$(OutDir).azurefunctions/runtimes/osx-arm64/native"/>
  </Target>
</Project>

遇到 gRPC 运行时问题

对于使用 Mx Mac(ARM64)的用户来说,您可能会遇到与持久函数相关的 gRPC 运行时问题。 解决方法:

  1. 请参考2.41.0版本的Contrib.Grpc.Core.M1 NuGet 包。

  2. 添加一个自定义生成后目标,确保可以找到正确的 gRPC 库 ARM64 版本。

    <Project>
      <ItemGroup>
        <PackageReference Include="Contrib.Grpc.Core.M1" Version="2.41.0" />
      </ItemGroup>
    
      <Target Name="CopyGrpcNativeAssetsToOutDir" AfterTargets="Build">
        <ItemGroup>
           <NativeAssetToCopy Condition="$([MSBuild]::IsOSPlatform('OSX'))" Include="$(OutDir)runtimes/osx-arm64/native/*"/>
        </ItemGroup>
        <Copy SourceFiles="@(NativeAssetToCopy)" DestinationFolder="$(OutDir).azurefunctions/runtimes/osx-arm64/native"/>
      </Target>
    </Project>