Azure Functions应用程序中可以使用IHostedService吗?

13
无论我们是否应该这样做,我们能在Azure Functions应用程序中使用IHostedService吗?
以下是尝试将托管服务(特别是后台服务)注册为IHostedService的方法:
internal sealed class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddHostedService<ExampleBackgroundService>();
    }
}

功能应用程序随后抛出以下异常:

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'

3
我在尝试将健康检查服务添加到Azure函数时遇到了相同的问题! - Umair
1个回答

11
不,目前不可能实现。这个GitHub问题中有一些讨论:
引用如下: “这将会影响动态缩放架构。规模控制器不知道任何在函数执行上下文之外运行的逻辑,并且可能因为认为应用程序处于空闲状态而进行缩放。除非人工触发功能执行,否则客户将没有可靠的机制来保持其运行,这肯定会引起混乱和支持案例。” “运行时和功能基础结构未设置用于函数上下文之外的计算。允许注册自定义托管服务将暴露启用该功能的功能,这将与其他基础设施组件(包括欺诈检测)不利地影响客户的应用)” 有关更多详细信息,请查看线程的其余部分。

感谢@Donut!跟进问题:我记得微软文档中关于实现记录器的说明明确指示(巧妙地)记录到硬盘,然后定期批量将日志条目移动到日志服务器。(不幸的是,我似乎无法再找到这个页面了。)在Azure Functions中是否有建议的替代方法? - Timo
@Timo 我不知道是否有替代方法,但这并不意味着没有。你可以尝试作为一个单独的问题来询问或浏览Azure/azure-functions-host存储库中的问题。 - Donut
说起来,第一个问题(“比例控制器不知道任何逻辑[...]”)似乎可以通过取消令牌来解决。任何后台进程都应该始终遵守取消(否则可能在处理过程中被终止)。比例控制器可以简单地触发关闭,并在它杀死它之前给实例5秒钟的时间。 - Timo
想一想,我们在这里讨论的大部分内容特别适用于BackgroundService(这是一个抽象类,可帮助您使用IHostedService进行后台工作)。对于许多不执行连续后台工作的IHostedService,这个讨论并不重要。该功能可能只是简单地启动和关闭,而IHostedService将相应地做出响应。 - Timo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接