1. 前言

博主在2020年中国.NET开发者大会上分享了该主题, 具体视频如下:

链接地址: https://www.bilibili.com/video/BV17V411n7DL/

2. 什么是高级功能托管服务

  1. 任何应用程序中都可能需要使用后台任务和计划作业, 你可以在一个单独的用于托管的进程/容器中实现后台任务, 一般在 .NET Core 中,我们将这些类型的任务称为托管服务
  2. 技术上来说, 托管服务是一个类,实现了IHostedService接口并包含了后台任务业务逻辑

3. 解决的问题

  1. 定时任务
    • 每隔X分钟刷新缓存
    • 每天X点执行统计任务
    • 日程的X分钟前发送消息提醒
  2. 异步执行后台任务
    • 导出海量数据

3. 方案

3.1 IHostedService

IHostedService是.NET Core 2.0新增的一个接口, 包含了StartAsync和StopAsync两个方法。

注意事项:

  1. 尽量将长时间的阻塞操作放在StartAsync之外
  2. 除非你希望执行完StartAsync后, 才启动你的应用
    • 例如: 数据库迁移、更新

优点:

  1. 可以完全控制任务启动和任务停止

3.2 BackgroundService

BackgroundService是.NET Core 2.1新增的一个抽象类, 实现了IHostedService接口, 并提供了ExecuteAsync抽象方法, 使用时,一般重写ExecuteAsync抽象方法即可。

优点:

  1. 可以快速的实现后台任务
  2. 不会阻塞应用启动
    • 除非重写StartAsync

缺点:

  1. 不适合占用资源多的后台任务
  2. 不适合实现太多的后台任务
    • Web应用水平扩展时会遇到幂等性问题

3.3 Worker Service

Worker Service.NET Core 3.0 新增的控制台应用的模板, 实现Ihost, 与IWebHost有相似的基础功能, 以为着也可以使用Configuration, Dependency Injection, Logging 等功能。

优点:

  1. 独立部署, 多种宿主选择
    • 控制台
    • Windows Service
    • systemd
  2. 避免程序池回收问题

3.4 Hangfire

Hangfire是一个开源且商业免费使用的工具函数库。可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows Service后台任务执行器。且任务信息可以被持久保存。内置提供集成化的控制台。

优点:

  1. 支持任务的定时执行和临时运行
  2. 自带监控和历史记录的UI
  3. 支持延续性任务执行
  4. 支持任务失败后自动重试
  5. 支持并发限制
  6. 将任务以及任务状态持久化到数据库

4. 总结

  1. IHostedService
    • 希望完全控制任务的开始和停止
  2. BackgroundService
    • 只需要一个简单的后台任务运行器, 实现少量的后台任务
  3. Worker Service
    • 希望可以独立部署
  4. Hangfire
    • 希望可以快捷的实现任务监控, 重试以及持久化等功能