day09 微服务阶段面试篇下
Java工程师高频面题:https://yjoffer.com/javaqa/readme.html
学习目标
- 能够说出xxl-job任务调度的优势
- 能说出xxl-job的组成结构
- 能够编写热点商品更新缓存任务
- 能够说出Redid的持久化机制
- 能够说出Redis主从同步原理
- 能够说出Redis哨兵模式的工作原理
- 能够说出Redis分片集群的工作原理
- 能够说出Redis五种基本数据类型
- 能够说出Redis ZSET类型的底层结构
- 能够说出Redis过期策略
- 能够说出Redis淘汰策略
🎬 视频播放链接
1 任务调度方案
1.1 什么是任务调度
1.1.1 概念
我们可以先思考一下下面业务场景的解决方案:
某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。
某银行系统需要在信用卡到期还款日的前三天进行短信提醒。
某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总。
12306会根据车次的不同,而设置某几个时间点进行分批放票。
某网站为了实现天气实时展示,每隔5分钟就去天气服务器获取最新的实时天气信息。
以上场景就是任务调度所需要解决的问题。
任务调度是指系统为了自动完成特定任务,在约定的特定时刻去执行任务的过程。有了任务调度即可解放更多的人 力由系统自动去执行任务。
在解决缓存击穿方案中,通过缓存定时预热避免缓存击穿。
1.1.2 技术方案
如何实现任务调度?
1、使用jdk提供的Timer定时器
示例代码如下:
每个Timer对应一个线程,可以同时启动多个Timer定时执行多个任务。
public static void main(String[] args){
Timer timer = new Timer();
timer.schedule(new TimerTask(){
@Override
public void run() {
//TODO:something
}
}, 1000, 2000); //1秒后开始调度,每2秒执行一次
}Time使用简单,可以实现每隔一定的时间去执行任务,但无法实现每天凌晨去执行任务,即在某个时间点去执行任务。
2、使用第三方Quartz方式实现
Quartz 是一个功能强大的任务调度框架(项目地址:https://github.com/quartz-scheduler/quartz ),它可以满足更多更复杂的调度需求,Quartz 设计的核心类包括 Scheduler, Job 以及 Trigger。其中,Job 负责定义需要执行的任务,Trigger 负责设置调度策略,Scheduler 将二者组装在一起,并触发任务开始执行。Quartz支持简单的按时间间隔调度、还支持按日历调度方式,通过设置CronTrigger表达式(包括:秒、分、时、日、月、周、年)进行任务调度。
虽然Quartz可以实现按日历调度的方式,但无法支持分布式环境下任务调度。分布式环境下通常一个服务部署多个实例即多个jvm进程,假设一个项目的微服务部署两个实例每个实例定时执行更新缓存的任务,两个实例就会重复执行。如下图:

3、使用分布式调度平台XXL-JOB
XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
官网:https://www.xuxueli.com/xxl-job/
文档:https://www.xuxueli.com/xxl-job/#《分布式任务调度平台XXL-JOB》
XXL-JOB主要有调度中心、执行器、任务:

调度中心:
负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码;
主要职责为执行器管理、任务管理、监控运维、日志管理等
任务执行器:
负责接收调度请求并执行任务逻辑;
主要职责是执行任务、执行结果上报、日志服务等
使用XXL-JOB可以解决多个jvm进程重复执行任务的问题,如下图:

XXL-JOB调度中心可以配置路由策略,比如:第一个、轮询策略、分片等,它们分别表示的意义如下:
第一个:即每次执行任务都由第一个执行器去执行。
轮询:即执行器轮番执行。
分片:每次执行任务广播给每个执行器让他们同时执行任务。
如果根据需求每次执行任务仅由一个执行器去执行任务可以设置路由策略:第一个、轮询。
如果根据需求每次执行任务由多个执行器同时执行可以设置路由策略为:分片。
xxl-job分布式任务调度系统具体有以下优势:
1、并行任务调度
并行任务调度实现靠多线程,如果有大量任务需要调度,此时光靠多线程就会有瓶颈了,因为一台计算机CPU的处理能力是有限的。
如果将任务调度程序分布式部署,每个结点还可以部署为集群,这样就可以让多台计算机共同去完成任务调度,我们可以将任务分割为若干个分片,由不同的实例并行执行,来提高任务调度的处理效率。
2、高可用
若某一个实例宕机,不影响其他实例来执行任务。
3、弹性扩容
当集群中增加实例就可以提高并执行任务的处理效率。
4、任务管理与监测
对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况,从而做出快速的应急处理响应。
5、避免任务重复执行
当任务调度以集群方式部署,同一个任务调度可能会执行多次,比如在上面提到的电商系统中到点发优惠券的例子,就会发放多次优惠券,对公司造成很多损失,所以我们需要控制相同的任务在多个运行实例上只执行一次。
1.1.3 小结
xxl-job任务调度与第三方Quartz或timer定时器实现任务调度有什么优势?
请免费关注 预见猿份 公众号,发送:yjoffer.com,获取解锁密码
微信扫码关注关注公众号回复获取密码后,在下方输入并点击解锁,本机后续再读无需重复输入。
