在项目中,经常需要使用调度作业来做一些业务
在JAVA世界中,常用的开源分布式调度作业框架有:1石英2弹簧批Quartz和springbatch非常强大,但是它们只需要多个数据库表来支持整个业务。对于一个简单的计划工作申请,品高云,它们有点重。
本文将介绍一个轻量级的,大数据教程,基于Redis的分布式调度作业资源协调
总体架构如下:
可以看出,该解决方案使用Redis集群作为多个分布式应用服务器的统一中央资源库
为了演示和说明该解决方案,我在本地启动了三个代码相同的应用程序,端口是:8081、8082和8083,个人免费云服务器,每个应用程序有三个作业:TestScheduleA、TestScheduleB和TestScheduleN。
在每个分布式应用程序中,每个调度作业为自己的作业定义一个唯一的密钥。然后每个作业都会调用方法获取关键职业,有哪些云服务器,如果职业成功,则继续业务流程。以"TestScheduleA"为例:
TestScheduleB和TestScheduleN是一样的,云发布,只是唯一的密钥不同。
代理类是这个解决方案的核心部分。
如注释所述,proxy方法首先将资源密钥设置为每个调度作业的唯一标识符。然后短暂休眠,等待来自其他不同服务器的其他调度作业实例使用其唯一标识符设置密钥的值。之后,将Key设置为Redis last的job返回true,表示该job实例成功占用了schedule job资源
从日志文件
可以看到:每台服务器的每一个作业都成功启动,业务的实际执行只有一次,成功避免了多台服务器同时执行同一个作业的情况
对于并发性要求高、作业量大、性能要求高的应用程序,建议使用开源框架,如Spring Batch和Quartz。
对于简单的业务场景,此解决方案将是实现分布式计划作业的快速方法。