1.单点定时任务
1)
在jdk1.5以后,可以使用ScheduledExecutorService来进行定时任务,项目中可以对该服务进行封装使用

public class SomeScheduledExecutorService {public static void main(String[] args) {// 创建任务队列,一共5个线程ScheduledExecutorService scheduledExecutorService =Executors.newScheduledThreadPool(5);// 执行任务: 1秒 后开始执行,每 60秒 执行一次scheduledExecutorService.scheduleAtFixedRate(() -> {System.out.println("执行任务:" + new Date());}, 10, 60, TimeUnit.SECONDS);}
}

2)基于redis的方案
基于Redis的实现可以通过多点来增加定时任务,多点消费。但是要做好防范重复消费的准备。

@Configuration
@EnableScheduling
public class RedisJob {public static final String JOB_KEY = "redis.job.task";private static final Logger LOGGER = LoggerFactory.getLogger(RedisJob.class);@Autowired private StringRedisTemplate stringRedisTemplate;/*** 添加任务.** @param task*/public void addTask(String task, Instant instant) {stringRedisTemplate.opsForZSet().add(JOB_KEY, task, instant.getEpochSecond());}/*** 定时任务队列消费* 每分钟消费一次(可以缩短间隔到1s)*/@Scheduled(cron = "0 0/1 * * * ? *")public void doDelayQueue() {long nowSecond = Instant.now().getEpochSecond();// 查询当前时间的所有任务Set<String> strings = stringRedisTemplate.opsForZSet().range(JOB_KEY, 0, nowSecond);for (String task : strings) {// 开始消费 taskLOGGER.info("执行任务:{}", task);}// 删除已经执行的任务stringRedisTemplate.opsForZSet().remove(JOB_KEY, 0, nowSecond);}
}

适用场景如下:
订单下单之后15分钟后,用户如果没有付钱,系统需要自动取消订单。
红包24小时未被查收,需要延迟执退还业务;
某个活动指定在某个时间内生效&失效;

优势是:

省去了MySQL的查询操作,而使用性能更高的Redis做为代替;
不会因为停机等原因,遗漏要执行的任务;
加粗样式3)redis键空间的方式

实现思路是给所有的定时任务设置一个过期时间,等到了过期之后,我们通过订阅过期消息就能感知到定时任务需要被执行了,此时我们执行定时任务即可。

默认情况下Redis是不开启键空间通知的,需要我们通过config set notify-keyspace-events
Ex的命令手动开启。
场景举例:

订单下单之后15分钟后,用户如果没有付钱,系统需要自动取消订单。
红包24小时未被查收,需要延迟执退还业务;
优劣势是:

被动触发,对于服务的资源消耗更小;
Redis的Pub/Sub不可靠,没有ACK机制等,但是一般情况可以容忍;
键空间通知功能会耗费一些CPU
2.分布式定时任务

什么是分布式定时任务,个人总结为:把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。

单点定时任务的缺点:

功能相对简单,交互性差,任务部署效率低,开发和维护成本比较高,不能很好的满足各系统定时任务的管理和控制,尤其在多系统的环境下更加明显;
许多任务都是单机部署,可用性差;
任务跟踪和告警难以实现。
分布式定时任务的优势:

通过集群的方式进行管理调度,大大降低了开发和维护成本;
分布式部署,保证了系统的高可用性,伸缩性,负载均衡,提高了容错;
可以通过控制台部署和管理定时任务,方便灵活高效;
任务都可以持久化到数据库,避免了宕机和数据丢失带来的隐患,同时有完善的任务失败重做机制和详细的任务跟踪及告警策略。

3.1 分时方案

严格划分时间片,交替运行计划任务,当主系统宕机后,备用系统仍然工作,但是处理初期被拉长了。
缺点:周期延长了。

3.2 HA高可用方案:

正常情况下主系统工作,备用系统守候,心跳检测发现主系统出现故障备用系统启动。
缺点:单一系统,不能做负载均衡,只能垂直扩展,也就是硬件层面的升级,无法做水平扩展。

3.3 多路心跳方案:

采用多路心跳,做服务级,进程级的,IP和端口级别的心跳检测,正常情况是主系统工作,备用系统守候,心跳检测主系统出现故障,备用系统启动,当再次检测到主系统工作,则将执行权交回主系统。
缺点:开发比较复杂,程序健壮性要求高。

3.4 任务抢占方案:

A,B两台服务器同时工作,启动需要存在一前一后,谁先启动谁率先加锁,其他服务器只能等待,他们同时对互斥锁进行监控,一旦发现锁被释放,其他服务那个先抢到,那个运行,运行前加排他锁。
优点:可以进一步实现多服务器横向扩展。
缺点:开发复杂,程序健壮性要求高,有时候会出现不释放锁的问题。

3.5 任务轮询或任务轮询+抢占排队方案

每个服务器首次启动时加入队列;
每次任务运行首先判断自己是否是当前可运行任务,如果是便运行;
如果不是当前运行的任务,检查自己是否在队列中,如果在,便推出,如果不在队列中,便键入队列。

分布式互斥锁:
互斥锁也叫排他锁,用于并发时管理多进程和多进程同一时刻只能有一个进程或者线程操作一个功能。我们将进程,线程中的锁延伸到互联网上,实现对一个节点运行的进程或线程加 锁,解锁操作。这样便能控制节点上的进程或线程的并发。
还可以通过对锁设置最大时间来解决server在加锁的过程中,出现宕机的问题

队列:
在上面的基础上,排队运行任务。

从上图中可以看出,TaskQueue中排队情况,运行是自上而下的,当然这个顺序可以自己设置规则,只需要先进先出的远程即可。另外,Task Queue我们需要做至少两个节点,他们遵循主 从结构的原则,主节点需要实时向从节点同步数据,保证在主节点不可用,从节点可以替代。当然,这里可以使用权重轮询的方式,加上数据异步同步,让所有节点都可以做主从的切换, 根据运行状况来分配,可能会更好,但是这样开发难度也有所提高,但是大大增加了高可用性。

当前比较流行的分布式定时任务框架:
Quartz:
Quartz是Java领域最著名的开源任务调度工具。Quartz提供了极为广泛的特性如持久化任务,集群和分布式任务
特点:
完全由Java写成,同时可以很方便的和java的另外一个框架spring集成;
强大的调度功能:支持丰富多样的调度方法,可以满足各种常规及特殊需求;
灵活的应用方式:支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
分布式和集群能力,负载均衡和高可用性;

分布式微服务定时任务方案相关推荐

  1. 分布式微服务项目实现高并发高可用高性能可以使用到的方案

    文章目录 前言 一.分布式高并发问题 1. 分布式锁 (1)mysql (2)redis (3)zookeeper+mysql乐观锁 分布式锁的问题和优化 2. 分布式事务 思路 (1)2pc 缺点: ...

  2. (二十)java版spring cloud+spring boot 社交电子商务平台-spring cloud构建全球多租户分布式微服务部署的方案...

    电子商务平台源码请加企鹅求求:一零三八七七四六二六.最近在用spring cloud分布式微服务云架构做一个全球多租户分布式部署的方案,我在这里只是简单的记录,当前的架构图只能是一个大概的方案,具体实 ...

  3. 分布式微服务学习总结——分布式微服务概述

    文章目录 一.前言 二.一个传统的App发展进程 三.为什么要用分布式微服务? 四.什么是分布式.微服务? 1.微服务是什么? 2.微服务架构是什么? 3.分布式是什么? 4.微服务架构和分布式的关系 ...

  4. 从单体架构到分布式微服务架构的思考

    一.单体架构 1.什么是单体架构? 单体架构也可叫单体系统或单体应用,是一种把系统所有的功能模块耦合在一个应用的架构方式. 2.单体架构的优缺点有哪些? (1)优点 部署简单: 技术单一: 用人成本相 ...

  5. (十六)java springcloud版b2b2c社交电商spring cloud分布式微服务-使用spring cloud Bus刷新配置...

    b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.我们使用spring cloud分布式微服务云架构做了b2b2c的电子商务系统,除了架构本身自带的系统服务外,我们将b2b2c的业务服 ...

  6. SpringCloud干货(2)---------大时代下的分布式微服务

    2019独角兽企业重金招聘Python工程师标准>>> 在学习SpringCloud之前,需要弄清楚SpringCloud是什么,他能够解决什么问题.另外,还需要区分一些具有混淆性的 ...

  7. springboot 事务统一配置_Spring Boot实现分布式微服务开发实战系列(五)

    最近已经推出了好几篇SpringBoot+Dubbo+Redis+Kafka实现电商的文章,今天再次回到分布式微服务项目中来,在开始写今天的系列五文章之前,我先回顾下前面的内容. 系列(一):主要说了 ...

  8. springboot 插入返回id_Spring Boot实现分布式微服务开发实战系列(七)

    今天已经进入第七讲了,整个微服务架构的搭建工作也基本完成.那到目前为止究竟使用了那些技术及实现了什么功能呢?我们先回顾一下. 使用的技术:SpringBoot.Dubbo.Zookeeper.Redi ...

  9. 分布式微服务开发_想要精通分布式微服务架构?你得先学会设计、原理与实战...

    前言 第1章分布式微服务架构设计原理 第2章彻底解决分布式系统一致性的问题 第3章服务化系统容量评估和性能保障 第4章大数据日志系统的构建 第5章基于调用链的服务治理系统的设计... 第6章Java服 ...

最新文章

  1. 在Asp.net MVC framework中使用扩展方法创建Html Helper
  2. Ubuntu 14.04 安装 CUDA 问题及解决
  3. 用javascript自制ctf词频分析工具
  4. [BZOJ3206][Apio2013]道路费用
  5. ALL in BERT:一套操作冲进排行榜首页
  6. Syntax error, parameterized types are only available if source level is 1.5
  7. linux卸载db2cli,DB2 for linux 安装
  8. jquery全局变量_jQuery源码一个小细节,却很好地体现了性能优化的思想,很优秀...
  9. windows无法确定此计算机是否包含,服务器用U盘虚拟光驱装系统,有做RAID5,加载RAID驱动成功后,安装到最后会报“windows无法确定此计算机是否包含有效系统卷”错误...
  10. elementUI的DatePicker+DateTimePicker组件的自定义日期禁用
  11. 数据库与数据库管理系统
  12. 【OpenCV 例程200篇】97. 反谐波平均滤波器
  13. 文本文件以EF BB开头,使用UTF8读取
  14. Atitit eclipse tomcat插件常见问题总结.docx 1.1. tomcat插件调整内存设置在 run run cfg 配置页。。Debug模式共享相同设置 1 1.2. Pub
  15. 鼠标光标一直在闪烁_硬核鼠标科普,选出适合你的鼠标
  16. 自然语言处理(八)——语言模型性能评价
  17. a股用计算机模拟走势,告诉你A股今后几天惊现千股涨停
  18. Thunder v7.9.5.4480 Ayu 优化版
  19. 你还会“袖手旁观”吗?
  20. WebDAV之葫芦儿•派盘+RS文件管理器

热门文章

  1. Oracle12.1闪回功能
  2. Read MIPS Run2nd MIPS cache(转)
  3. Python中imread()函数
  4. python抓取美女图片实例
  5. 腾讯云轻量应用服务器网站搭建——入门教程1(宝塔面板)
  6. java抗锯齿_java.awt.Graphics2D抗锯齿(字体平滑)处理
  7. #define用法详解
  8. 黄金分割点c的坐标c语言,黄金分割法与进退法的C语言程序
  9. android odex文件作用,安卓odex详细介绍
  10. Docker开放2375TCP端口