研究了一整天的quartz.net,发现一直无法解决cluster模式下多个node独立运行的问题,改了很多配置项,仍然是每个node各自为战。本来cluster模式下的各个node应该是负载均衡的,现在却变成了“冗余”。quartz.net的文档很不完善,而且最新版是2018年发布的了,虽然很容易调通单机版的quartz.net,但是考虑到docker环境下负载均衡时多容器共同运行的问题,必须解决cluster中多个节点同时只运行1个的问题,也就是说“1分钟1次”是指全局所有节点“1分钟1次”,而不是每个节点“1分钟1次”。

痛苦之后,发现了hangfire!配置非常简单,而且支持redis,支持di,配置了一下,一次成功!

开发环境:asp.net core 3.1

首先安装必要的包:

<ItemGroup>
<PackageReference Include="Hangfire.AspNetCore" Version="1.7.11" />
<PackageReference Include="Hangfire.Redis.StackExchange" Version="1.8.2" />
</ItemGroup>

然后修改Startup.cs

namespace HangfireTest
{
public class Startup
{
public static ConnectionMultiplexer Redis; public Startup(IConfiguration configuration)
{
Configuration = configuration;
Redis = ConnectionMultiplexer.Connect("redis");
} public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(); services.AddHangfire(configuration => {
configuration.UseRedisStorage(Redis);
}); services.AddSingleton<TestJob>();
} public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//... app.UseHangfireServer();
RecurringJob.AddOrUpdate<TestJob>("MinutelyEcho", jobs => jobs.Run(), Cron.Minutely);
}
}
}

然后,实现一个“正常的”任务类:

using System;

namespace HangfireTest
{
public class TestJob
{
public void Run(){
Console.WriteLine(DateTime.Now);
}
}
}

在Startup中注册任务类和添加调度,这里是每分钟1次。

为了测试多个node的实际运行情况,将程序打包成docker(省略Dockerfile),并编写docker-compose文件:

version: ''
services:
app:
image: hftest
deploy:
replicas:
ports:
- :
redis:
image: redis

hftest是我打包好的docker镜像,注意这里relicas=2,设置了2个备份。

然后,使用docker stack deploy命令进行部署,使用docker logs命令观察任务执行情况。

docker logs 节点1

info: Microsoft.Hosting.Lifetime[]
Content root path: /app
// ::
// ::

docker logs 节点2

info: Microsoft.Hosting.Lifetime[]
Content root path: /app
// ::

证明任务在多个节点上的运行就如同在1个节点一样,并未重复运行。

最后简单对比一下quartz.net和hangfire(hangfire仅接触1天,说的可能不正确,请指正):

项目 quartz.net hangfire
最新代码 2018 几天前
支持redis 不支持 支持
图形界面 不支持 支持
cluster 有问题(重复执行) 完美
配置代码量
任务支持依赖注入 默认不支持 支持

总体来说,除了quartz在java上比较流行的优势之外,在.net上,目前hangfire应该是完胜quartz.net.

asp.net core计划任务探索之hangfire+redis+cluster的更多相关文章

  1. 第十二节:Asp.Net Core 之分布式缓存(SQLServer和Redis)

    一. 整体说明 1. 说明 分布式缓存通常是指在多个应用程序服务器的架构下,作为他们共享的外部服务共享缓存,常用的有SQLServer.Redis.NCache.     特别说明一下:这里的分布式是 ...

  2. 记一次使用Asp.Net Core WebApi 5.0+Dapper+Mysql+Redis+Docker的开发过程

    #前言 我可能有三年没怎么碰C#了,目前的工作是在全职搞前端,最近有时间抽空看了一下Asp.net Core,Core版本号都到了5.0了,也越来越好用了,下面将记录一下这几天以来使用Asp.Net ...

  3. ASP.NET Core开发-后台任务利器Hangfire使用

    ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/任务计划程序. 可以使用于ASP.NET 应用也 ...

  4. asp.net core 系列之Response caching(1)

    这篇文章简单的讲解了response caching: 讲解了cache-control,及对其中的头和值的作用,及设置来控制response caching; 简单的罗列了其他的缓存技术:In-me ...

  5. asp.net core 实战之 redis 负载均衡和"高可用"实现

    1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...

  6. ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存

    .NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中.对于分布式缓存,.NET Core提供了针对 ...

  7. 简易的开发框架(微服务) Asp.Net Core 2.0

      Asp.Net Core 2.0 + Mysql Orm + Ioc + Redis + AOP + RabbitMQ + Etcd + Autofac + Swagger 基础框架: https ...

  8. 在Asp.Net Core中使用DI的方式使用Hangfire构建后台执行脚本

    最近项目中需要用到后台Job,原有在Windows中我们会使用命令行程序结合计划任务或者直接生成Windows Service,现在.Net Core跨平台了,虽然Linux下也有计划任务,但跟原有方 ...

  9. Hangfire 在asp.net core环境的使用

    hf被定义为分布式后台服务,更加类似job作业的服务做作业的插件有quartz.net,JobScheduler 等当然,都有一些分别和适用的场景.1.安装需要安装Hangfire.CoreHangf ...

随机推荐

  1. Complete the Sequence HDU - 1121

    题目大意: 输入两个数n和m,n表示有n个数,这n个数是一个多项式的前n项,让输出这个序列的n+1,n+2,..n+m项. 题解:差分规律,一直差分,直到全为0或者只剩下一个数.然后再递推回去. 给出 ...

  2. [PHP][mysql] 需要知道的那些事

    就是想总结一下自己不会的! sql: 1.在SQL语句中出现AS,是起别名的意思! 例子:select a.* from table_1 as a就是给table_1起个别名叫a,因此前面就可以使用a ...

  3. C# 静态变量、静态函数、实体变量、实体函数在一个类中的执行顺序

    为了弄清这个代码,写了个测试,但是测试的结果和往上的代码有所差别,仁者见仁,智者见智了.如果我的测试用例用问题,欢迎指出. 首先,方法的是在被调用时执行,但是静态方法在所有地方都可以调用,应该在很早的 ...

  4. 前端面试的那些事儿(1)~JavaScript 原始数据类型

    前言 自我总结面试常问的一些细节,方便不断回顾与补充.第一次发表文章,如有问题或不足之处望及时指出. JavaScript 原始数据类型 1.1 基础数据类型 7大基础数据类型 boolean nul ...

  5. Spring Security 是如何在 Servlet 应用中执行的?

    Spring Security 是一个强大的认证和授权框架,它的使用方式也非常简单,但是要想真正理解它就需要花一时间来学习了,最近在学习 Spring Security 时有一些新的理解,特意记录下来 ...

  6. Python模块---制作新冠疫情世界地图()

    目录 pyecharts模块 简介 安装pyecharts 测试pyecharts模块 pyecharts实战:绘制新冠肺炎疫情地图 需求分析 请求数据 提取数据 处理数据 制作可视化地图 设置可视化 ...

  7. Android | 教你如何快速集成机器学习能力

    背景   继上篇博文说了如何快速集成扫码以后 我又上官网去了解了一下其他的功能,其中机器学习服务是当下比较火的,而且还是免费的.就赶紧点进去学习一下.看看能够快速实现哪些功能. 链接在这里:https ...

  8. C# 基础知识系列- 14 IO篇 文件的操作

    0. 前言 本章节是IO篇的第二集,我们在上一篇中介绍了C#中IO的基本概念和一些基本方法,接下来我们介绍一下操作文件的方法.在编程的世界中,操作文件是一个很重要的技能. 1. 文件.目录和路径 在开 ...

  9. Linux 用户管理和提权

    Linux ⽀持多个⼈使⽤同⼀个⽤户登录系统, Windows 在修改组策略的情况下,也可以多个⼈使⽤同⼀个⽤户登录 远程连接Linux的⽅式:SSH协议 远程连接Windows的⽅式:RDP协议 安 ...

  10. Vue-cli3.0下的雪碧图插件webpack-spritesmith配置方法

    在前端项目中,为了减少对图片的请求次数,一般而言需要进行雪碧图的配置.即将多张小图标合并成一张图片,这样页面中的小图标都在一张图片上,只需请求一张图片,就可以通过CSS设置各个小图标的显示,利于节省带 ...