asp.net core计划任务探索之hangfire+redis+cluster
研究了一整天的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的更多相关文章
- 第十二节:Asp.Net Core 之分布式缓存(SQLServer和Redis)
一. 整体说明 1. 说明 分布式缓存通常是指在多个应用程序服务器的架构下,作为他们共享的外部服务共享缓存,常用的有SQLServer.Redis.NCache. 特别说明一下:这里的分布式是 ...
- 记一次使用Asp.Net Core WebApi 5.0+Dapper+Mysql+Redis+Docker的开发过程
#前言 我可能有三年没怎么碰C#了,目前的工作是在全职搞前端,最近有时间抽空看了一下Asp.net Core,Core版本号都到了5.0了,也越来越好用了,下面将记录一下这几天以来使用Asp.Net ...
- ASP.NET Core开发-后台任务利器Hangfire使用
ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/任务计划程序. 可以使用于ASP.NET 应用也 ...
- asp.net core 系列之Response caching(1)
这篇文章简单的讲解了response caching: 讲解了cache-control,及对其中的头和值的作用,及设置来控制response caching; 简单的罗列了其他的缓存技术:In-me ...
- asp.net core 实战之 redis 负载均衡和"高可用"实现
1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...
- ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存
.NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中.对于分布式缓存,.NET Core提供了针对 ...
- 简易的开发框架(微服务) Asp.Net Core 2.0
Asp.Net Core 2.0 + Mysql Orm + Ioc + Redis + AOP + RabbitMQ + Etcd + Autofac + Swagger 基础框架: https ...
- 在Asp.Net Core中使用DI的方式使用Hangfire构建后台执行脚本
最近项目中需要用到后台Job,原有在Windows中我们会使用命令行程序结合计划任务或者直接生成Windows Service,现在.Net Core跨平台了,虽然Linux下也有计划任务,但跟原有方 ...
- Hangfire 在asp.net core环境的使用
hf被定义为分布式后台服务,更加类似job作业的服务做作业的插件有quartz.net,JobScheduler 等当然,都有一些分别和适用的场景.1.安装需要安装Hangfire.CoreHangf ...
随机推荐
- 关于树的重心--POJ 1655
树的重心的定义: 在一棵树中,找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡. 通俗来说就是以这个点为根节点,找到他最大的衣蛾子树,然后 ...
- 程序选择结构if和switch的定义以及使用方法
什么是if选择结构 if选择结构是根据条件判断之后在做处理 基本的if选择结构的语法 if(条件){//条件为真则执行代码1,否则不执行 //代码块1 } if-else选择结构 为什么使 ...
- redis管道操作(事务),无回滚
管道:将数据操作放在内存中,只有成功后,才会一次性全部放入redis #管道(事务),要是都成功则成功,失败一个全部失败 #原理:将数据操作放在内存中,只有成功后,才会一次性全部放入redis pip ...
- 前端基础进阶(六)-大厂面试题问题:循环闭包与setTimeout
我在上一篇闭包的文章中留下了一个关于setTimeout与循环闭包的思考题. 利用闭包,修改下面的代码,让循环输出的结果依次为1, 2, 3, 4, 5 for (var i = 1; i <= ...
- C语言字符数组超细讲解
看到标题,有不少朋友会想:字符数组不也是数组吗?为什么要单独拿出来讲哩?莫非它是朵奇葩? 哈哈,确实,一起来认识一下这朵数组界的奇葩吧! 一.字符数组的定义.引用.初始化 大家好!我是字符数组,看我的 ...
- 3、flink架构,资源和资源组
一.flink架构 1.1.集群模型和角色 如上图所示:当 Flink 集群启动后,首先会启动一个 JobManger 和一个或多个的 TaskManager.由 Client 提交任务给 JobMa ...
- Inno Setup 升级时不再询问用户安装路径
UsePreviousAppDir Description: When this directive is yes, the default, at startup Setup will look i ...
- How to skip all the wizard pages and go directly to the installation process?
https://stackoverflow.com/questions/22183811/how-to-skip-all-the-wizard-pages-and-go-directly-to-the ...
- java 8 Streams简介
目录 简介 Functional Interface Function:一个参数一个返回值 BiFunction:接收两个参数,一个返回值 Supplier:无参的Function Consumer: ...
- pynlpir.License过期问题解决方案
报错信息:pynlpir.LicenseError: Your license appears to have expired. Try running "pynlpir update&qu ...