8

.NET Core/.NET5/.NET6 开源项目汇总2:任务调度组件

 2 years ago
source link: https://www.cnblogs.com/SavionZhang/p/14863766.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

.NET Core/.NET5/.NET6 开源项目汇总2:任务调度组件

开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激、尊重。请严格遵守每个项目的开源协议后再使用。尊重知识产权,共建和谐开源社区。

以下开源项目(含组件),从网络搜集,后期会不断补充。

FluentScheduler

FluentSchedule 是.NET平台下的一款轻量级任务调度组件。接口丰富,功能强大,简单易容。官网提供的丰富示例,让开发者很容易上手。如果在项目中简单的设置定时任务,优先使用该组件。

官网:https://fluentscheduler.github.io/

GitHub:https://github.com/fluentscheduler/FluentScheduler

ScheduleMaster

ScheduleMaster是一个开源的分布式任务调度系统,它基于.NET Core 3.1平台构建,支持跨平台多节点部署运行。

主要特性:

  •  简易的Web UI操作;

  •  任务动态管理:创建、启动、停止、暂停、恢复、删除等;

  •  高可用支持,跨平台多节点部署。

  •  数据安全性,不会出现多实例并发调度。

  •  支持自定义参数设置;

  •  支持 .NET Core 和 .NET Framework(4.6.1+);

  •  支持自定义配置文件和热更新;

  •  支持设置监护人,运行异常时邮件告警;

  •  支持设置任务依赖,自动触发,共享任务结果;

  •  插件式开发,任务运行环境隔离;

  •  全链路日志系统,运行轨迹轻松掌控;

  •  用户访问控制;

  •  提供开放REST API,业务系统可以无缝集成;

  •  调度报表统计;

  •  任务分组管理;

  •  计划表拆分实现复用;

  •  指定节点运行;

  •  支持http任务配置;

  •  支持延时任务;

  •  任务监控;

  •  资源监控;

  •  支持异常策略配置(失败重试、超时控制等);

  •  接入redis缓存;

  •  多数据库类型支持;

  •  用户权限更加精细化;

  •  报表统计完善;

技术栈:

ASP.NET Core3.1、EntityFramework Core3.0、Mysql5.7、Quartz.Net、BeyondAdmin、Jquery...

Gitee:https://gitee.com/hey-hoho/ScheduleMasterCore

Quartz.NET
142275-20210608203158308-216243017.png
  Quartz.NET是.NET平台下应用最早最广泛的老牌定时任务任务调度组件。它是一个功能齐全的开源作业调度系统,从小的应用程序到大型企业系统都可以使用。它可以与任何其他软件系统集成,也可以与任何其他软件系统一起使用。它提供了简单的操作,如调度/非调度作业、启动/停止/暂停调度程序等。
  使用Quartz.NET可以定时轮询数据库同步、定时邮件通知、定时处理数据等。 Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。

.NET Framework 通过 System.Timers.timer 类具有“内置”计时器功能。为什么有人会使用Quartz而不是这些标准功能?
原因包括以下几个方面:

  • 计时器没有持久性机制。
  • 计时器的调度不灵活(只能设置开始时间和重复间隔,不能基于日期、时间等进行设置)。
  • 计时器不使用线程池(每个计时器一个线程)。
  • 计时器没有真正的管理方案——你必须编写自己的机制,以便能够记住、组织和按名称检索任务等。

对于一些简单的应用程序,这些功能可能并不重要,在这种情况下,不使用Quartz.NET可能是正确的决定。

官网:https://www.quartz-scheduler.net/

GitHub:https://github.com/quartznet/quartznet

Hangfire

Hangfire是一个开源框架,它帮助您创建、处理和管理后台作业。

功能特征:

  • 支持基于队列的任务处理。任务执行不是同步的,而是放到一个持久化队列中,以便马上把请求控制权返回给调用者。使用方法:
BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
  • 延迟任务(方法)执行。可以将方法的执行推迟一段指定的时间,而不是立即调用方法:
BackgroundJob.Schedule(() => Console.WriteLine("Hello, world!"), TimeSpan.FromMinutes(5));
  • 循环执行任务。只需简单的一行代码就可以添加重复执行的任务,其内置了常见的时间循环模式,也可以基于CRON表达式来设定复杂的模式。使用方法:
RecurringJob.AddOrUpdate(() => Console.Write("Easy!"), Cron.Daily);
RecurringJob.AddOrUpdate(() => Console.Write("Powerful!"), "0 12 * */2");
  • SQL Server 与 Redis 持久化支持。Hangfire使用持久性存储来存储作业、队列和统计信息,并让它们在应用程序重启后继续存在。存储子系统的抽象程度足以支持经典的SQL Server和快速的Redis。
    • SQLServer提供了简化的安装和常规的维护计划。
    • Redis提供了惊人的速度,尤其是与sqlserver相比,但需要更多的知识。
  • 自动重试机制。如果你的方法遇到了一个暂时的异常,不用担心——它会在几秒钟内自动重试。如果所有重试尝试都已用尽,则可以从集成的web界面手动重新启动。还可以使用AutomaticRetryAttribute类控制重试行为。只需将其应用于您的方法,告诉Hangfire重试次数:
    [AutomaticRetry(Attempts = 100)]
    public static void GenerateStatistics() { }
    
    BackgroundJob.Enqueue(() => GenerateStatistics());
  • 保证执行任务。Hangfire是在知道托管环境可以杀死每行上的所有线程的情况下制作的。因此,它在成功完成之前不会删除作业,并且包含不同的隐式重试逻辑以在其处理中止时执行该作业。
  • 实例方法调用。Hangfire除了支持静态方法调用,还支持调用实例方法。当worker看到给定的方法是实例方法时,它将首先激活它的类。默认情况下,使用Activator.CreateInstance方法,因此默认情况下仅支持具有默认构造函数的类。但是您可以插入IoC容器并通过构造函数传递依赖项。
public class EmailService
{
    public void Send() { }
}

BackgroundJob.Enqueue<EmailService>(x => x.Send());
  • 文化捕捉。当您将方法调用编组到另一个执行上下文中时,您应该能够保留一些环境设置。他们中有些人-Thread.CurrentCulture以及Thread.CurrentUICulture将自动为您拍摄。PreserveCultureAttribute默认情况下,它由应用于所有方法的类完成。
  • 支持任务取消。Hangfire可以告诉方法由于shutdown事件而被中止或取消,因此可以使用类似于常规CancellationToken类的作业取消令牌来优雅地停止它们。
public void Method(IJobCancellationToken token)
{
    for (var i = 0; i < Int32.MaxValue; i++)
    {
        token.ThrowIfCancellationRequested();
        Thread.Sleep(1000);
    }
}
  • 支持IOC容器。目前支持Ninject和Autofac。
  • 支持日志记录。Hangfire使用Common.Logging库来记录其所有事件。
  • 友好的Web支持。可以在相同或不同的机器上运行多个 Hangfire 实例。它使用分布式锁定来防止竞争条件。每个 Hangfire 实例都是冗余的,可以无缝添加或删除实例(但要控制它们侦听的队列)。
  • 支持多队列处理。同一个Hangfire实例可以支持多个队列,以便更好的控制任务的执行方式。
  • 并发级别的控制。Hangfire使用自己的固定工作线程池来消耗排队的作业。默认工作进程计数设置为 Environment.ProcessorCount*5,即CPU数量的5倍。此数字针对CPU密集型和I/O密集型任务进行了优化。如果遇到过多的等待或上下文切换,可以手动配置工作进程的数量:
app.UseHangfire(config =>
{
    config.UseServer(100);
});

// or
var server = new BackgroundJobServer(100);
  • 多环境处理任务。默认情况下,作业处理是在 ASP.NET 应用程序中进行的。但是您可以在控制台应用程序、Windows 服务或其他任何地方处理作业。
  • 可扩展性。Hangfire 旨在尽可能通用。您可以扩展以下部分:
    • 状态子系统(包括创建新状态)
    • 创造就业的过程
    • 工作绩效流程
    • 状态变化过程
    • 工作激活过程

一些核心组件作为扩展:QueueAttribute、PreserveCultureAttribute、AutomaticRetryAttribute、SqlServerStorage、RedisStorage、NinjectJobActivator、AutofacJobActivator、ScheduledState。

官网:https://www.hangfire.io/

MVP 2015社区大讲堂之:在ASP.NET应用中执行后台任务

PPT:http://pan.baidu.com/s/1eQpKURK


参考文献:

  • https://www.cnblogs.com/redmoon/p/4394962.html

 142275-20210511143255073-1133010989.png技术栈

 1、Visual Studio、.NET:C#、.NET5、.NET6、.NET Core、MVC、ASP.NET Core、Web API、RESTful API、gRPC、SignalR

 2、jQuery、Vue.js、Bootstrap

 3、数据库:SQLServer、MySQL、PostgreSQL、Oracle、SQLite、SequoiaDB 、Redis、MongoDB、ElasticSearch、TiDB、达梦DM、人大金仓、 神通、南大通用 GBase、华为 GaussDB 、腾讯 TDSQL 、阿里 PolarDB、蚂蚁金服 OceanBase、东软 OpenBASE、浪潮云溪数据库 ZNBase

 4、ORM:Dapper、Entity Framework、FreeSql、SqlSugar、分库分表

 5、架构:领域驱动设计 DDD、ABP

 6、环境:跨平台、Windows、Linux(CentOS、中标麒麟、统信UOS、深度Linux)、maxOS、IIS、Nginx、

 7、移动App:Android、IOS、HarmonyOS、微信、小程序、快应用、Xamarin、uni-app、MUI、Flutter、Framework7、Cordova、Ionic、React Native、Taro、NutUI、mpvue、Smobiler

 云原生、CI/CD、DevOps、微服务、Docker、K8S;

 Dapr、RabbitMQ、Kafka、分布式、大数据、高并发、负载均衡、中间件、RPC、ELK;

 .NET + Docker + jenkins + Github + Harbor + K8S;

 Python、Go。

出处:www.cnblogs.com/SavionZhang

作者:张传宁   微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。

        专注于微软.NET技术(.NET Core、Web、MVC、WinForm、WPF)、通用权限管理系统、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。

        多次参与电子政务、国家电网、图书教育、生产制造等企业级大型项目研发与管理工作。

        熟悉中小企业软件开发过程:需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业快速化实现互联网技术全流程解决方案。


本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

如有问题,可以通过邮件[email protected]联系。共同交流、互相学习。

如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK