Asp.Net Core高级功能托管服务 - .NET Conf 2020
1. 前言
博主在2020年中国.NET开发者大会上分享了该主题, 具体视频如下:
链接地址: https://www.bilibili.com/video/BV17V411n7DL/
2. 什么是高级功能托管服务
- 任何应用程序中都可能需要使用后台任务和计划作业, 你可以在一个单独的用于托管的进程/容器中实现后台任务, 一般在 .NET Core 中,我们将这些类型的任务称为托管服务
- 技术上来说, 托管服务是一个类,实现了IHostedService接口并包含了后台任务业务逻辑
3. 解决的问题
- 定时任务
- 每隔X分钟刷新缓存
- 每天X点执行统计任务
- 日程的X分钟前发送消息提醒
- 异步执行后台任务
- 导出海量数据
3. 方案
3.1 IHostedService
IHostedService是.NET Core 2.0新增的一个接口, 包含了StartAsync和StopAsync两个方法。
注意事项:
- 尽量将长时间的阻塞操作放在StartAsync之外
- 除非你希望执行完StartAsync后, 才启动你的应用
- 例如: 数据库迁移、更新
优点:
- 可以完全控制任务启动和任务停止
3.2 BackgroundService
BackgroundService是.NET Core 2.1新增的一个抽象类, 实现了IHostedService接口, 并提供了ExecuteAsync抽象方法, 使用时,一般重写ExecuteAsync抽象方法即可。
优点:
- 可以快速的实现后台任务
- 不会阻塞应用启动
- 除非重写StartAsync
缺点:
- 不适合占用资源多的后台任务
- 不适合实现太多的后台任务
- Web应用水平扩展时会遇到幂等性问题
3.3 Worker Service
Worker Service.NET Core 3.0 新增的控制台应用的模板, 实现Ihost, 与IWebHost有相似的基础功能, 以为着也可以使用Configuration, Dependency Injection, Logging 等功能。
优点:
- 独立部署, 多种宿主选择
- 控制台
- Windows Service
- systemd
- 避免程序池回收问题
3.4 Hangfire
Hangfire是一个开源且商业免费使用的工具函数库。可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows Service后台任务执行器。且任务信息可以被持久保存。内置提供集成化的控制台。
优点:
- 支持任务的定时执行和临时运行
- 自带监控和历史记录的UI
- 支持延续性任务执行
- 支持任务失败后自动重试
- 支持并发限制
- 将任务以及任务状态持久化到数据库
4. 总结
- IHostedService
- 希望完全控制任务的开始和停止
- BackgroundService
- 只需要一个简单的后台任务运行器, 实现少量的后台任务
- Worker Service
- 希望可以独立部署
- Hangfire
- 希望可以快捷的实现任务监控, 重试以及持久化等功能