.NET Core开源组件:后台任务利器之Hangfire

 

一.简述

Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库。在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4.X环境中配置always running的麻烦,真正做到开箱即用。

二.安装

Hangfie官方支持是MsSql和redis,除此之外,可供选择的还有PostgreSqlMongo
在应用入口项目需要引用Hangfire.AspNetCore和特定持久库,比如使用了MsSql数据库的Hangfire.SqlServer
而在其他项目(比如bll层的项目),只需引用基础的Hangfire.Core就可以了。

三.Startup配置

1.注入Hnagfire服务

services.AddHangfire(x => x.UseSqlServerStorage("<connection string>"));

2.可选配置

启动Hangfire服务和对应的web面板如下:

 app.UseHangfireServer();//启动Hangfire服务
app.UseHangfireDashboard();//启动hangfire面板

细心的观众可能会发现,这两个方法都有可选参数,可以提供更多的配置。

2.1 配置任务属性

var jobOptions = new BackgroundJobServerOptions
{
Queues = new[] { "test","default" },//队列名称,只能为小写
WorkerCount = Environment.ProcessorCount * 5, //并发任务数
ServerName="hangfire1",//服务器名称
};
app.UseHangfireServer(jobOptions);

Queues 要处理的队列列表
对于有多个服务器同时连接到数据库,Hangfire会认为他们是分布式中的一份子。现实中不同服务器往往存在着差异,这个时候就需要合理配置服务器(应用)的处理队列,举两个例子:
1.对于服务器性能差异的处理,有100个A任务和50个B任务需要处理,假设A服务器的性能是B服务器的两倍,如果不配置队列,那么会平分任务给两个服务器。如果我们只让B服务器处理B任务,而A服务器同时处理两种任务,这样B就能减少一些压力。

2.对于服务器能力差异的处理,假设A服务器能处理A和B两种任务,B服务器只能处理B任务(没有处理A任务的方法或对象),如果不配置队列,默认会让B也执行A任务,从而产生错误。反面一想,如果A服务器和B服务器都有共同的接口,B服务器不实现接口的方法,发起一个专属于A服务器队列的任务,而A服务器通过注入实现接口的方法,可以达到传递任务的效果。

WorkerCount 并发任务数,超出并发数将等待之前的任务完成
默认的并发任务数是线程(cpu)的5倍,如果IO密集型任务多而CPU密集型的任务少,可以考虑调高并发任务数。

以上是我用到的,当然还有其他配置参数等着你去开发。

2.2.配置访问权限

在实际生产中,我们可能不希望任何人都可以访问面板,或暂停执行某些任务,这时就需要重写面板的权限了。默认情况下,只有本地访问权限才能使用Hangfire仪表板。所以需要重写控制面板,以便远程访问。

 var options = new DashboardOptions
{
Authorization = new[] { new HangfireAuthorizationFilter() }
};
app.UseHangfireDashboard("/hangfire", options);
public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
{
//这里需要配置权限规则
public bool Authorize(DashboardContext context)
{
return true;
}
}

三.使用(官方文档)

任务类型

Fire-and-forget 直接将任务加入到待执行任务队列
Delayed 在当前时间后的某个时间将任务加入到待执行任务队列
Recurring 周期性任务,每一个周期就将任务加入到待执行任务队列
Continuations 顾名思义,继续执行任务

1.简单入门

using (var connection = JobStorage.Current.GetConnection())
{
var storageConnection = connection as JobStorageConnection;
if (storageConnection != null)
{
//立即启动
var jobId = BackgroundJob.Enqueue(()=>Console.WriteLine("Fire-and-forget!"));
}
}

当然,不仅仅只有静态方法可以执行,Hangfire的任务也是支持.net core的依赖注入的,会构造一个对象并执行对应的方法。

BackgroundJob.Enqueue<SomeClass>(i => i.SomeMethod(someParams))

2.进阶功能

2.1设置任务队列

[Queue("test")]
public void TestQueue()
{
}

对于非周期任务,只需要在执行的方法添加Queue的特性就能指定该任务让特定的队列服务器处理。
而周期任务,则需要先声明:

RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring!"),Cron.Daily,queue:"test");

2.2 使用日志过滤器(点我查看)

Hangfire支持自定义过滤器,可以对任务在创建时、执行中、执行后等等状态执行特定特定的操作。

//特定方法过滤器
[LogEverything]
public static void Send() {
}
//全局过滤器
GlobalJobFilters.Filters.Add(new LogEverythingAttribute());

四.中文文档

hangfire是一个不错的开源后台任务组件,官方没有中文文档,所以简单地用谷歌机翻修改了一下。

文档在github的地址:https://github.com/jonechenug/Hangfire-Chinese-Doc

docker运行并访问本地8080端口:

docker run --restart always  --name hangfire -d -p 8080:80 daocloud.io/koukouge/hangfirezhdoc

.NET Core开源组件:后台任务利器之Hangfire 转载 https://www.cnblogs.com/chenug/p/6655636.html的更多相关文章

  1. .NET Core开源组件:后台任务利器之Hangfire

    一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4.X环境中配置always ru ...

  2. 后台任务利器之Hangfire

    后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4 ...

  3. net5 中 后台任务利器之Hangfire 的使用

    什么是Hangfire Hangfire 是一个开源的.NET任务调度框架,目前1.6+版本已支持.NET Core.它最大特点在于内置提供集成化的控制台,方便后台查看及监控: 另外,Hangfire ...

  4. ASP.NET Core 菜鸟之路:从Startup.cs说起 转发https://www.cnblogs.com/chenug/p/6869109.html

    1.前言 本文主要是以Visual Studio 2017 默认的 WebApi 模板作为基架,基于Asp .Net Core 1.0,本文面向的是初学者,如果你有 ASP.NET Core 相关实践 ...

  5. ASP.NET Core MVC/WebAPi 模型绑定探索 转载https://www.cnblogs.com/CreateMyself/p/6246977.html

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  6. Net Core开源通讯组件 SmartRoute

    Net Core开源通讯组件 SmartRoute(服务即集群) SmartRoute是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置 ...

  7. Magicodes.Admin.Core开源框架总体介绍

    框架说明 Magicodes.Admin.Core框架在ABP以及ASP.NET ZERO的基础上进行了封装和完善,目前基于.NET Core 2.0+(Framework版本),由于部分组件在.NE ...

  8. Github上优秀的.NET Core开源项目的集合

    内容包括:库.工具.框架.模板引擎.身份认证.数据库.ORM框架.图片处理.文本处理.机器学习.日志.代码分析.教程等. Github地址:https://github.com/jasonhua95/ ...

  9. 大数据并行计算利器之MPI/OpenMP

    大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...

随机推荐

  1. xcode安装pod

    参考了: https://blog.csdn.net/AugustDY/article/details/92078639 输入 ruby -v ,查看当前电脑的ruby版本,如果已经安装了ruby环境 ...

  2. Python 进阶_OOP 面向对象编程_静态方法和类方法

    目录 目录 静态方法 类方法 使用函数修饰符来声明静态方法和类方法 静态方法 静态方法仅是类中的函数, 不需要绑定实例, 也就是说静态方法的定义不需要传入 self 参数. 静态方法不属于类的某一个实 ...

  3. 用 Flask 来写个轻博客 (20) — 实现注册表单与应用 reCAPTCHA 来实现验证码

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 reCAPTCHA 应用 reCAPTCHA 前文列表 用 Flask ...

  4. MySQL数据库参数优化

    概述 最近在对各个系统的mysql做一些参数上的优化,也开了慢查询,准备后面针对特定sql再进一步优化.下面主要介绍一下一些优化的参数. 1.优化前mysql配置 可以看到基本上是没怎么做优化的. 2 ...

  5. Vim使用taglist功能

    下载 wget http://www.vim.org/scripts/download_script.php?src_id=19574 -O taglist.zip 然后解压taglist.zip到~ ...

  6. golang 国内环境配置

    写在 .bashrc 或 .zshrc 等文件中: # golang env export GO111MODULE=on export GOPROXY=https://goproxy.cn #七牛云提 ...

  7. Lock的使用

    Lock是一个Java类,synchronized是一个Java关键字,两者有本质的不同 Lock需要手动释放锁,synchronized是自动释放锁 Lock适合大量同步的代码同步,synchron ...

  8. java File I/O

    File类: 常用方法: boolean exists( ):判断文件或目录是否存在 boolean isFile( ):判断是否是文件 boolean isDirectory( ):判断是否是目录 ...

  9. txt文本程序 打开python文件 另存为原来的文件名,不能覆盖原来的文件解决

    txt文本程序 打开python文件 另存为原来的文件名,不能覆盖原来的文件 如:1.py文件用txt文本程序打开后,另存为 1.py,保存完毕后,不覆盖1.py文件,会生成 1.py.txt文件 原 ...

  10. Spring Boot & Redis 用起来真简单!

    作者:java_老男孩  https://blog.51cto.com/14230003/2368721 Redis 是目前业界使用最广泛的内存数据存储.相比 Memcached,Redis 支持更丰 ...