本期将提供quartz集群能力
- 集群案例分析:
上一期的邮件发送功能,若在服务须要部署多节点,但定时任务不支持集群,所以,多节点定时任务势必会同时运行,
若向用户发送邮件通知,这种状况下会向用户发送两次如出一辙的邮件,N个节点会发送N次邮件,严重不符合业务场景,
若提供集群能力,则多节点间应分担邮件发送的工做而不是各节点作重复的工做,所以在部署多节点的时候定时任务也须要提供集群能力。
- 我的看法:
- quartz集群分为水平集群和垂直集群,水平集群即将定时任务节点部署在不一样的服务器,水平集群最大的问题就是时钟同步问题,
quartz集群强烈要求时钟同步,若时钟不能同步,则会致使集群中各个节点状态紊乱,形成不可预知的后果,请自行搜索服务器时钟同步
,
若能保证时钟同步,水平集群能保证服务的可靠性,其中一个节点挂掉或其中一个服务器宕机,其余节点依然正常服务;垂直集群则是集群各节点部署在同一台服务器,
时钟同步天然不是问题,但存在单点故障问题,服务器宕机会严重影响服务的可用性。所以,要结合实际状况来考虑集群方案
- 因为集群中强烈要求时钟同步,所以无论是垂直集群仍是水平集群,本地开发决不能链接线上环境(本地也是集群模式),这样的话势必会破坏集群,但本地如果非集群模式,
则能够依状况来链接线上环境。
- quartz集群和redis这样的集群实现方式不同,redis集群须要节点之间通讯,各节点须要知道其余节点的情况,而quartz集群的实现
方式在于11张表,集群节点相互之间不通讯,而是经过定时任务持久化加锁的方式来实现集群。
- 破坏集群后果通常是死锁或者状态紊乱每一个节点都不可用或其中某些节点能用部分或所有的定时任务
1. 建立集群须要的11张表
t_b_qrtz_blob_triggers
t_b_qrtz_calendars
t_b_qrtz_cron_triggers
t_b_qrtz_fired_triggers
t_b_qrtz_job_details
t_b_qrtz_locks
t_b_qrtz_paused_trigger_grps
t_b_qrtz_scheduler_state
t_b_qrtz_simple_triggers
t_b_qrtz_simprop_triggers
t_b_qrtz_triggers
2. 集群建表sql
drop table if exists t_b_qrtz_fired_triggers; drop table if exists t_b_qrtz_paused_trigger_grps; drop table if exists t_b_qrtz_scheduler_state; drop table if exists t_b_qrtz_locks; drop table if exists t_b_qrtz_simple_triggers; drop table if exists t_b_qrtz_simprop_triggers; drop table if exists t_b_qrtz_cron_triggers; drop table if exists t_b_qrtz_blob_triggers; drop table if exists t_b_qrtz_triggers; drop table if exists t_b_qrtz_job_details; drop table if exists t_b_qrtz_calendars; create table t_b_qrtz_job_details( sched_name varchar(120) not null, job_name varchar(200) not null, job_group varchar(200) not null, description varchar(250) null, job_class_name varchar(250) not null, is_durable varchar(1) not null, is_nonconcurrent varchar(1) not null, is_update_data varchar(1) not null, requests_recovery varchar(1) not null, job_data blob null, primary key (sched_name,job_name,job_group)) engine=innodb; create table t_b_qrtz_triggers ( sched_name varchar(120) not null, trigger_name varchar(200) not null, trigger_group varchar(200) not null, job_name varchar(200) not null, job_group varchar(200) not null, description varchar(250) null, next_fire_time bigint(13) null, prev_fire_time bigint(13) null, priority integer null, trigger_state varchar(16) not null, trigger_type varchar(8) not null, start_time bigint(13) not null, end_time bigint(13) null, calendar_name varchar(200) null, misfire_instr smallint(2) null, job_data blob null, primary key (sched_name,trigger_name,trigger_group), foreign key (sched_name,job_name,job_group) references t_b_qrtz_job_details(sched_name,job_name,job_group)) engine=innodb; create table t_b_qrtz_simple_triggers ( sched_name varchar(120) not null, trigger_name varchar(200) not null, trigger_group varchar(200) not null, repeat_count bigint(7) not null, repeat_interval bigint(12) not null, times_triggered bigint(10) not null, primary key (sched_name,trigger_name,trigger_group), foreign key (sched_name,trigger_name,trigger_group) references t_b_qrtz_triggers(sched_name,trigger_name,trigger_group)) engine=innodb; create table t_b_qrtz_cron_triggers ( sched_name varchar(120) not null, trigger_name varchar(200) not null, trigger_group varchar(200) not null, cron_expression varchar(120) not null, time_zone_id varchar(80), primary key (sched_name,trigger_name,trigger_group), foreign key (sched_name,trigger_name,trigger_group) references t_b_qrtz_triggers(sched_name,trigger_name,trigger_group)) engine=innodb; create table t_b_qrtz_simprop_triggers ( sched_name varchar(120) not null, trigger_name varchar(200) not null, trigger_group varchar(200) not null, str_prop_1 varchar(512) null, str_prop_2 varchar(512) null, str_prop_3 varchar(512) null, int_prop_1 int null, int_prop_2 int null, long_prop_1 bigint null, long_prop_2 bigint null, dec_prop_1 numeric(13,4) null, dec_prop_2 numeric(13,4) null, bool_prop_1 varchar(