执行后台任务的利器——Hangfire
2016-03-09 10:27
483 查看
Hangfire是一个开源且商业免费使用的工具函数库。可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows Service后台任务执行器。且任务信息可以被持久保存。内置提供集成化的控制台。
通过Nuget就可以在你的应用程序中安装Hangfire:Install-Package Hangfire
Hangfire的具有如下特性和有点:
支持基于队列的任务处理:任务执行不是同步的,而是放到一个持久化队列中,以便马上把请求控制权返回给调用者。使用方法:BackgroundJob.Enqueue(() => Console.WriteLine("Simple!"));
延迟任务执行:不是马上调用方法,而是设定一个未来时间点再来执行。使用方法:BackgroundJob.Schedule(() => Console.WriteLine("Reliable!"), TimeSpan.FromDays(7));
循环任务执行:只需要简单的一行代码就可以添加重复执行的任务,其内置了常见的时间循环模式,也可以基于CRON表达式来设定复杂的模式。使用方法:RecurringJob.AddOrUpdate(() => Console.WriteLine("Transparent!"), Cron.Daily);
持久化保存任务、队列、统计信息:默认使用SQL Server,也可以配合消息队列来降低队列处理延迟,或配置使用Redis来获得更好的性能表现
内置自动重试机制:可以设定重试次数,还可以手动在控制台重启任务
除了调用静态方法外还支持实例方法
能够捕获多语言状态:即可以把调用者的Thread.CurrentCulture和Thread.CurrentUICulture信息同任务持久保存在一起,以便任务执行的时候多语言信息是一致的
支持任务取消:使用CancellationToken这样的机制来处理任务取消逻辑
支持IoC容器:目前支持Ninject和Autofac比较常用的开源IoC容器
支持Web集群:可以在一台或多台机器上运行多个Hangfire实例以便实现冗余备份
支持多队列:同一个Hangfire实例可以支持多个队列,以便更好的控制任务的执行方式
并发级别的控制:默认是处理器数量的5倍工作行程,当然也可以自己设定
具备很好的扩展性:有很多扩展点来控制持久存储方式、IoC容器支持等
为什么要使用Hangfire这样的函数库呢?我觉得好处有如下几个方面:
开发简单:无需自己额外做开发,就可以实现任务的队列执行、延迟执行和重复执行
部署简单:可以同主ASP.NET应用部署在一起,测试和维护都相对简单
迁移简单:由于宿主不仅限于ASP.NET,那么未来可以非常容易的把任务执行器放到其他地方(需要改变的就是在其他宿主中启动Hangfire服务器)
扩展简单:由于开源且有很多扩展点,在现有插件都不满足自己需要的情况下能够容易的进行扩展
之前我把Hangfire运用到两种情况下:
后台长时间的科学计算:这样就可以让请求马上返回给客户端,后台完成长时间计算后,用SignalR实时提醒用户
后台群发邮件:通过延迟和循环任务分批通过SendCloud这样的服务发送群发邮件
当然,Hangfire的应用场景还很多,比如在后台处理电商卖家的订单。
通过Nuget就可以在你的应用程序中安装Hangfire:Install-Package Hangfire
Hangfire的具有如下特性和有点:
支持基于队列的任务处理:任务执行不是同步的,而是放到一个持久化队列中,以便马上把请求控制权返回给调用者。使用方法:BackgroundJob.Enqueue(() => Console.WriteLine("Simple!"));
延迟任务执行:不是马上调用方法,而是设定一个未来时间点再来执行。使用方法:BackgroundJob.Schedule(() => Console.WriteLine("Reliable!"), TimeSpan.FromDays(7));
循环任务执行:只需要简单的一行代码就可以添加重复执行的任务,其内置了常见的时间循环模式,也可以基于CRON表达式来设定复杂的模式。使用方法:RecurringJob.AddOrUpdate(() => Console.WriteLine("Transparent!"), Cron.Daily);
持久化保存任务、队列、统计信息:默认使用SQL Server,也可以配合消息队列来降低队列处理延迟,或配置使用Redis来获得更好的性能表现
内置自动重试机制:可以设定重试次数,还可以手动在控制台重启任务
除了调用静态方法外还支持实例方法
能够捕获多语言状态:即可以把调用者的Thread.CurrentCulture和Thread.CurrentUICulture信息同任务持久保存在一起,以便任务执行的时候多语言信息是一致的
支持任务取消:使用CancellationToken这样的机制来处理任务取消逻辑
支持IoC容器:目前支持Ninject和Autofac比较常用的开源IoC容器
支持Web集群:可以在一台或多台机器上运行多个Hangfire实例以便实现冗余备份
支持多队列:同一个Hangfire实例可以支持多个队列,以便更好的控制任务的执行方式
并发级别的控制:默认是处理器数量的5倍工作行程,当然也可以自己设定
具备很好的扩展性:有很多扩展点来控制持久存储方式、IoC容器支持等
为什么要使用Hangfire这样的函数库呢?我觉得好处有如下几个方面:
开发简单:无需自己额外做开发,就可以实现任务的队列执行、延迟执行和重复执行
部署简单:可以同主ASP.NET应用部署在一起,测试和维护都相对简单
迁移简单:由于宿主不仅限于ASP.NET,那么未来可以非常容易的把任务执行器放到其他地方(需要改变的就是在其他宿主中启动Hangfire服务器)
扩展简单:由于开源且有很多扩展点,在现有插件都不满足自己需要的情况下能够容易的进行扩展
之前我把Hangfire运用到两种情况下:
后台长时间的科学计算:这样就可以让请求马上返回给客户端,后台完成长时间计算后,用SignalR实时提醒用户
后台群发邮件:通过延迟和循环任务分批通过SendCloud这样的服务发送群发邮件
当然,Hangfire的应用场景还很多,比如在后台处理电商卖家的订单。
相关文章推荐
- C#第三方控件的使用
- java 实现WebService 以及不同的调用方式
- 判断一个单链表是否有环及环的链接点
- 【Unity】 旧版动画 在某一帧增添事件
- JavaScript 数据类型总结
- 停止手打所有cpp文件到android.mk
- 第一行代码复读收获(二)
- java解析XML(4种方式)
- 《VR入门系列教程》之18---Oculus代码剖析
- 蓝桥杯练习系统VIP试题-算法提高-阶乘计算
- Solr基础教程之Schema.xml(二)
- 使用objc_getAssociatedObject, objc_setAssociatedObject动态扩展属性
- JDK6和JDK7中的substring()方法
- 利用a标签自动解析URL
- Introducing RecyclerView(二)
- mysql count 优化
- C语言中各种整型变量在不同字长机器上的字节数详细探讨
- 【Android】常见面试题(二)
- android usb 异步请求理解
- JavaSE_JavaDoc注释详解