IHostedService 可用于 Azure Functions 应用程序吗?

Posted

技术标签:

【中文标题】IHostedService 可用于 Azure Functions 应用程序吗?【英文标题】:IHostedService usable in Azure Functions App? 【发布时间】:2020-05-13 18:33:01 【问题描述】:

无论我们是否应该,我们可以在 Azure Functions 应用程序中使用 IHostedService 吗?

这里尝试将托管服务(特别是后台服务)注册为IHostedService

internal sealed class Startup : FunctionsStartup

    public override void Configure(IFunctionsHostBuilder builder)
    
        builder.Services.AddHostedService<ExampleBackgroundService>();
    

Functions App 然后抛出以下异常:

Microsoft.Azure.WebJobs.Script.InvalidHostServicesException: 'The following service registrations did not match the expected services:
  [Invalid] ServiceType: Microsoft.Extensions.Hosting.IHostedService, Lifetime: Singleton, ImplementationType: ExampleBackgroundService'

【问题讨论】:

我在尝试将 HealthCheck 服务添加到 azure 函数时遇到了同样的问题! 【参考方案1】:

不,这目前是不可能的。对此GitHub issue有一些讨论:

这不适用于动态扩展基础架构。缩放控制器不知道在函数执行的上下文之外运行的任何逻辑,并且如果它认为应用程序处于空闲状态,则可以进行缩放。除非客户人为地触发函数执行,否则客户将没有可靠的机制来保持其运行,这肯定会产生混乱和支持案例。

运行时和函数基础架构未设置为用于函数上下文之外的计算。允许注册自定义托管服务将公开启用该功能的功能,该功能无法与其他基础架构组件(包括可能严重影响客户应用程序的欺诈检测)配合使用。

线程的其余部分有更多详细信息,值得查看以获取更多信息。

【讨论】:

谢谢@Donut!后续问题:我记得有关实现记录器的 Microsoft 文档明确指示(巧妙地)将日志记录到硬盘驱动器,然后定期将日志条目批量移动到日志服务器。 (不幸的是,我似乎再也找不到这个页面了。)在 Azure Functions 中是否有建议的替代方法? @Timo 我不知道有任何替代方案,但这并不是说没有替代方案。可以尝试作为一个单独的问题提问或查看Azure/azure-functions-host repo 上的问题。 想一想,第一点(“秤控制器不知道任何逻辑[...]”)似乎可以通过取消令牌来解决。任何后台进程都应始终尊重取消(或有可能在进程中被终止)。规模控制器可以简单地触发关闭,并在它杀死它之前给实例 5 秒。 想一想,我们在这里讨论的大部分内容都特别适用于BackgroundService(帮助您使用IHostedService 进行后台工作的抽象类)。对于许多不执行连续后台工作的IHostedServices,讨论不是问题。函数可以简单地上下旋转,IHostedService 会相应地响应。

以上是关于IHostedService 可用于 Azure Functions 应用程序吗?的主要内容,如果未能解决你的问题,请参考以下文章

用于后台任务的asp.net框架中的Ihostedservice等价物

使 azure 网站仅可用于其他 azure 网站

IHostedService 的多种实现

Azure APIM:是不是有任何 IDE 插件可用于使用智能感知编写 Azure Policy

Azure - 使 API 应用程序可用于逻辑应用程序

我应该如何将 DbContext 实例注入 IHostedService?