HangFire分布式后端作业调度框架服务

简介: HangFire 分布式后端作业调度框架服务,我们只需要关心业务逻辑代码,而不用关心调度机制,支持.net framework和.net core

HangFire简述:
分布式后端作业调度框架服务,我们只需要关心业务逻辑代码,而不用关心调度机制,支持.net framework和.net core

HangFire基本结构:
客户端(创建任务)、服务端(执行任务)、数据库(存储任务列表和执行状况)、仪表盘(在网站上对任务进行监控查看和各种操作)

HangFire适用场景:
定时执行任务、循环执行任务、异步执行耗时任务、A任务执行完成再执行B任务、批量执行任务

HangFire官网: https://www.hangfire.io/
HangFire中文文档:http://koukouge-hangfire.daoapp.io/quick-start.html
HangFire英文文档:http://docs.hangfire.io/en/latest/quick-start.html
HangFire源码地址: https://github.com/HangfireIO


image

实战经验分享:
网上资料不是很多 都是按照官方例子在讲解,缺少很多关键性的概念讲解,导致很多伙计在实战中遇到各种坑。

1、客户端:创建任务-->1、配置HangFire数据库连接 2、创建任务(在创建任务的时候HangFire会自动将任务序列化并存储到数据)

2、服务端:执行任务-->1、配置HangFire数据库连接 2、从HangFire数据库系统表读取客户端创建的任务然后开线程并行执行,任务之间不冲突。(服务端可宿主在Windows服务、控制台程序、IIS中…)

3、数据库:HangFire程序框架表-->创建任务的时候HangFire会自动生成无需关心,但要注意如果采用现有的数据库,必须保证数据库中没有重名的表,否则你懂(aggregatedcounter、counter、distributedlock、hash、job、jobparameter、jobqueue、jobstate、list、server、set、state),数据库可采用 MySQL ,MSSQL,Redis视需要而定

4、仪表盘:展示作业列表执行状态和结果等相关信息-->在.Net WebForm或.Net MVC 或.NetCore MVC网站程序对接HangFire数据库,MVC 对接方式和WebForm略微不同 请参考官方文档


如何正确理解架设部署上述4个板块:
重点说客户端、服务端、仪表盘直之间的关系,数据库就不用多说了

方案1(不推荐):客户端A、服务端B、仪表盘C 分别运行在3个独立的项目中
优缺点:没什么优点,而且AB分开会导致服务端B从数据库提取任务列表,准备反向加载程序集执行任务的时候,在自己的程序代码中找不到对应的业务逻辑代码或者引用类,因为业务逻辑代码是在客户端A项目中创建,自然业务逻辑类及功能代码都在A项目的程序集中,自然找不到。

例子:客户端A创建的作业是引用YourOwnJobLibrary.dll类中 ShowMeTheMoney() 方法,而服务端B中没有引用YourOwnJobLibrary.dll 所以无法执行任务ShowMeTheMoney(),

报错:System.IO.FileNotFoundException
Could not load file or assembly 'DotNetFrameWorkConsoleApplicationHangFire, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. ???????????
System.IO.FileNotFoundException: Could not load file or assembly 'DotNetFrameWorkConsoleApplicationHangFire, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. ???????????
File name: 'DotNetFrameWorkConsoleApplicationHangFire, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type, ObjectHandleOnStack keepalive)
at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName)
at System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
at System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)
at Hangfire.Storage.InvocationData.Deserialize()

解决方案:让服务端B也引用YourOwnJobLibrary.dll即可,但是这并不是我们想要的结果,以后更新服务什么的还得两头更新很麻烦。

方案2(推荐):客户端A、服务端B在同一个项目中,仪表盘C独立网站项目中
优缺点:这样比较合理,更新服务方便,即便没有仪表盘C,作业正常调度执行;适合后台相对固定的作业。
可以将AB放在Windows服务项目中(VS中可以创建),这样系统重启什么的毫无顾虑,更新服务程序的时候只需停止服务->替换程序->开启服务即可。

方案3(还行):客户端A、服务端B、仪表盘C在同一网站项目只能是网站项目,因为仪表盘只能在Web项目(API、WebForm、MVC )中
优缺点:视情况也未尝不可,如果宿主在IIS中,IIS默认20分钟没有人访问会停止,HangFire作业服务也会定制,可将此时间在IIS配置中延长,比较适合任务经常需要灵活变动处理的场景。

重要信息备注:
注1:创建任务可以是在控制台程序Main方法中执行一次把任务Load到数据库,或则在网站上用户点击某个按钮执行后端方法创建。


注2:服务端比较灵活,可宿主在Windows服务、控制台程序、IIS中…

注3:首次启动连接数据库时,会自动生成12张系统表,请确保现有库中不存在以下表名:aggregatedcounter、counter、distributedlock、hash、job、jobparameter、jobqueue、jobstate、list、server、set、state


注4:原则上同一台电脑上只需要1个服务端存在,测试中发现这么一种情况:服务端B宿主在D控制台程序中,因误操作在仪表盘C网站项目中也启动一个HangeFire宿主服务E,最后的结果是服务端B的程序失效,服务端E正常运作,但是仪表盘上显示找不到任务作业对应的程序集,因为程序集在服务端B程序中,如方案1的System.IO.FileNotFoundException…


注5:HangFire执行的任务里面如果涉及到C盘创建文件夹 可能会因为权限问题 创建失败,采用管理员权限运行程序即可创建


实例:按照方案2思路测试

  1. 创建一个.net core 2.0控制台项目(.net framework/.net core2.0都行)
  2. 安装nuget Hangfire(针对控制台程序可以只安装Hangfire.core即可 )
  3. 安装nuget HangFire.MySql.Core(.net framework 也引用此包 如果用HangFire.MySql 下面的配置数据库链接事变)
  4. 安装好后就可以在Main方法中使用了

image

注:控制台程序关闭,也就是HangFire宿主程序停止,作业无法继续执行,想检测服务作业是否在执行,可定时往记事本中写入当前时间。

5、网站(.net core)中配置HangFire仪表盘:( .net framework 的网站配置不一样 尚未测试)
image

注1:app.UseHangfireDashboard(); 是让网站仅仅可以访问HangFire数据库的作业详情,不负责业务代码的执行。

注2:app.UseHangfireServer();是让HangFire服务宿主在Web程序中,参加上面方案2和方案3,如果是方案2则不应该添加此语句,方案3则添加此语句。


运行项目访问HangFire仪表盘: http://localhost:56013/hangfire/
image

image
其他参考链接: http://blog.csdn.net/quryktcs/article/details/71331727

相关文章
|
8天前
|
负载均衡 监控 Go
使用Golang框架构建分布式系统
本文探讨了使用Golang构建分布式系统的方法。Golang因其高效、简洁的语法和并发支持成为理想的开发语言。文中列举了几个常用的Golang框架,如Echo、Gin、gRPC和NATS等,并强调了服务拆分、通信机制、负载均衡等构建分布式系统的关键要素。通过选择合适的框架,遵循需求分析、技术选型、服务设计等步骤,开发者可以构建出高性能、高可用和可扩展的系统。此外,文中还提供了一个使用gRPC和etcd的简单代码案例来说明实现过程。
26 4
|
4天前
|
存储 监控 负载均衡
Zookeeper 详解:分布式协调服务的核心概念与实践
Zookeeper 详解:分布式协调服务的核心概念与实践
11 0
|
7天前
|
分布式计算 负载均衡 并行计算
Python 分布式计算框架 PP (Parallel Python):集群模式下的实践探索
该文介绍了使用Parallel Python (PP) 在两台物理机上构建分布式计算集群的经验。PP是一个轻量级框架,旨在简化Python代码在多处理器系统和集群中的并行执行。文中通过设置子节点的IP、端口和密钥启动PP服务器,并在主节点创建PP实例进行负载均衡。实验使用官方的质数和计算示例,显示PP在集群模式下能有效利用多台机器的多核CPU,实现计算效率的显著提升。未来,作者计划进一步研究PP在更复杂任务和大规模集群中的应用潜力。
|
18天前
|
分布式计算 Hadoop 大数据
分布式计算框架比较:Hadoop、Spark 与 Flink
【5月更文挑战第31天】Hadoop是大数据处理的开创性框架,专注于大规模批量数据处理,具有高扩展性和容错性。然而,它在实时任务上表现不足。以下是一个简单的Hadoop MapReduce的WordCount程序示例,展示如何统计文本中单词出现次数。
69 0
|
19天前
|
存储 算法
服务中一个简单的分布式系统
【5月更文挑战第21天】本文介绍一个分布式算法,旨在解决高速和低速网络环境下进程间保持相同通信频率的问题。算法通过frequencyEpoch防止过时信息导致无效切换,确保只有在多数节点检测到当前频率嘈杂时才会切换。
23 0
服务中一个简单的分布式系统
|
21天前
|
存储 关系型数据库 MySQL
|
21天前
|
分布式计算 网络协议 大数据
基于C++的分布式计算框架设计与实现
基于C++的分布式计算框架设计与实现
55 2
|
29天前
|
Cloud Native 数据管理 关系型数据库
【阿里云云原生专栏】云原生数据管理:阿里云数据库服务的分布式实践
【5月更文挑战第21天】阿里云数据库服务在云原生时代展现优势,应对分布式数据管理挑战。PolarDB等服务保证高可用和弹性,通过多副本机制和分布式事务确保数据一致性和可靠性。示例代码展示了在阿里云数据库上进行分布式事务操作。此外,丰富的监控工具协助用户管理数据库性能,支持企业的数字化转型和业务增长。
192 1
|
29天前
|
SQL 分布式计算 Hadoop
Spark分布式内存计算框架
Spark分布式内存计算框架
52 0

热门文章

最新文章