quartz mysql索引_分布式系统中的定时任务全解(二)

在实际项目中,通常需要用到定时任务(定时作业),spring框架提供了很好的实现。 1、  下载spring-quartz插件包 这里默认当前系统中是集成了spring框架的基本功能的。去网上下载spring定时器的jar包,这里用的是quartz-all-1.8.4.jar,下载完成之后添加的项

概述

上一篇分布式系统中的定时任务全解(一)中对定时任务和定时任务的基础使用方式进行了说明。这一小节,把分布式场景下的定时任务进行一个大致的讲解。

什么是分布式场景呢,当单台服务器服务能力不够的时候,就需要更多的服务器进行水平向的扩展,由多台服务器分工(任务量上的水平划分,而非业务线上的垂直划分)的方式来增强服务能力,提供更强的并发请求处理,更短的时间响应。

像第一节说到的定时任务使用场景,大多是一次任务执行仅能有一个服务器在执行,如果是所有服务器都在执行相同的任务,一个是会造成错误,就算不会造成错误,很多服务器在做重复的工作也是极大的浪费。

所以,分布式场景下定时任务要做的一个基本难点就是:怎么让某一个定时任务,在一个触发时点上仅有一台服务器在执行。

更进一步,如果,你的定时任务涉及到很多同类型的数据要处理,比如说要处理100个输入文件,处理方式相同;再比如说你的数据库已经做了分库处理,业务数据被写入到了10个数据库实例中,处理方式相同。那么此时,可以让更多台服务器执行定时任务,每台执行其中的一部分,比如10个输入文件;再比如1个数据库实例中的业务数据。

以上两种场景怎么办呢?第一种很简单,后续会提供三种方式去做:1.设置某一台为任务执行服务器,其他服务器不执行;2.使用quartz的集群功能,实现某一台执行;3.使用当当开源的elastic-job,实现某一台执行。第二种场景只有第一种场景中的第3中方式可以做到。

接下来逐个看一下。

实现分布式的方式

设置某一台为任务执行服务器

这种方式可以采用环境变量的方式来实现,定时任务运行时检查本机的环境变量值是否为可执行,如果是则执行定时任务,如果不是则直接返回。

@Value("${ISTIMERRUNNER}")

private String isTimerRunner;

@Scheduled(cron="0 0 0 * * ? ")

public void task(){

try {

if("true".equals(isTimerRunner)){

//do something.....

}

} catch (Exception e) {

e.printStackTrace();

}

}

这里有一个需要注意的事项,如果集群环境下,你使用了脚本部署的方式,而且是类似于作者的方式。也就是先把文件拷贝到一台服务器,启动好后,调用脚本(脚本参见:http://blog.csdn.net/buqutianya/article/details/51062384),逐个部署到其他服务器。那么,你就需要注意一下了。

远程ssh调用startup.sh时,tomcat取不到环境变量,这里需要把startup.sh的顶部进行修改:

#!/bin/sh --login

当然这里还有另外一种方式,就是在tomcat的bin目录中添加一个setenv.sh文件,startup.sh执行时会加载其中的内容。

export ISTIMERRUNNER=true

这种方式有十分明显的缺陷:1.单点,当任务执行节点出现问题时,整个定时任务全部over;2.资源分配不均衡,随着定时任务的增多,任务执行服务器的资源占用压力会越来越大。

当然了,这是在技术能力不够的时候,最简单有效的实现方式。

使用quartz的集群功能

quartz这个老牌的定时任务执行工具,在集群方面也提供了很好的支持。quartz的集群是借助数据库来实现的,所有的服务器实例共享一套数据库表中存储的任务、触发器和调度器信息,实现一个时间点,同一个任务仅有一台服务器在执行。而且提供了负载均衡和failover失败转移功能。

quartz的负载均衡大概是这样的策略:对于需要调度很多任务的调度器,会近似随机的选择服务器执行;对于调度的任务数比较少的(1个或者2个)的触发器,会尽量的在同一台服务器上执行。(可以参见这里:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-11.html)一、Quartz的特点 按作业类的继承方式来分,主要有以下两种: 作业类继承org.springframework.scheduling.quartz.QuartzJobBean类的方式作业类不继承org.springframework.scheduling.quartz.QuartzJobBean类的方式 注:个人比较推崇第二种,因为这种方式下的

quartz的集群使用也不复杂,接下来一起看一下:

1.导入数据库表

quartz的集群是基于数据库实现的,所以首先要把数据库表结构创建好。创建脚本在quartz的完整下载包里可以找到(官网下载地址:http://www.quartz-scheduler.org/downloads/)。

解压之后,在docs/dbTable目录下可以找到你想要的所有常见数据库类型的创建脚本。

7b153d272f10cac2a55eea739f6b95f4.png

我使用的是sql数据库,所以使用了tables_mysql_innodb.sql。

这里导入的时候遇到了一个问题,就是创建索引时索引字段过长。这里我采用的方法是把所有的scheduler的长度变成了50,修改之后也就是会限制所有的scheduler的名字在50个字节以内。

2.创建支持集群的scheduler

集群和非集群的配置不同,关键就在于scheduler,集群时需要给scheduler配置数据源、将org.quartz.jobStore.isClustered设置为true、以及配置quartz.properties属性文件。详细的实现方式可以参见:http://sundoctor.iteye.com/blog/486055

使用elastic-job

elastic-job是基于quartz实现的,最大的不同点是elastic-job把做为共享中心的数据库换成了zookeeper。所以要使用elastic-job首先要安装zookeeper。

安装好zookeeper之后,使用elastic-job也不难,它做了很好的spring集成支持,只需要配置注册中心和执行任务的job即可。

以下是一个配置文件的示例:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:reg="http://www.dangdang.com/schema/ddframe/reg"

xmlns:job="http://www.dangdang.com/schema/ddframe/job"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.dangdang.com/schema/ddframe/reg http://www.dangdang.com/schema/ddframe/reg/reg.xsd http://www.dangdang.com/schema/ddframe/job http://www.dangdang.com/schema/ddframe/job/job.xsd ">

这里简单的说一下elastic-job相对于quartz的优势:

1.使用zookeeper做为协调,更加轻量级,这一点对于使用者来说也是一个困难项,因为无论再小的服务也有一个数据库,所以定时任务也使用数据库,那么用起来省事一点。但使用zookeeper一方面速度快,另一方面是不占用现有数据库的连接和计算资源。

2.支持任务的分片,quartz同一时点,同一任务只能在一台机器上运行,但是elastic-job可以在多台机器上运行,并且能够指定每台服务器上运行的输入分片。比如业务数据在10个数据库,这里总共有5台服务器,那么每台服务器在同一个时点,仅处理其中的2个数据库。做到将可纵向切分的任务,切分给不同的服务器,充分利用资源,加快计算速度。

elastic-job怎么做到的分片,在不同的场景下我们该怎么使用elastic-job,接下来的一节将从源代码的角度进行讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【牛客 - 331B】炫酷五子棋(STLset 或Hash,tricks,二维map标记)

题干: 五子棋是一个简单的双人游戏。 小希最近在思索一种更好玩的五子棋。她希望胜利不再是谁先五子连珠谁赢,而变成谁落子后,该子与之前的子五子连珠的次数更多才能胜利。 但是如果是在普通的棋盘上,这个游戏又显得不是很有趣…

【牛客 - 318J】王者荣耀(dp,01背包)

题干: "无论何时何地,都会遵守约定"。"奋力逃吧"。"关于取下敌人性命这件事,也从不失约"。 小懒虫zmx平时最喜欢玩的游戏就是《王者荣耀》,在这款游戏中它也最喜欢百里守约这个英雄。最近&#x…

xodo上的笔记不见了_goodnotes 的笔记无缘无故丢失了一本,还能救回来吗?

真的什么都没有做,很普通的记完笔记放在那里去吃饭,回来的时候,别的笔记都没变化,只有我一直在用、刚记完的那一本消失了……我尝试过的方案:1.icloud刚开始不确定那里有没有,我平时是开着 icloud 对笔记的…

【牛客 - 318G】LLLYYY的数字思维 与【牛客 - 289J】这是一个沙雕题II(贪心构造)

题干: LLLYYY很喜欢写暴力模拟贪心思维。某一天在机房,他突然抛给了队友ppq一 个问题。问题如下: 有一个函数f (): int f(int x){ int tmp 0; while(x ! 0){ tmp x % 10; x / 10; } return tmp; } 接着…

react div组件设置可点击不可点击_React面试全解

更新:收藏前点个赞亲,为啥我每次写的东西收藏都是赞的n倍!!花了一个月时间总结的React面试题 希望能帮助到你全文近万字建议保存仔细过一遍目录面试中常提的重要概念React生命周期ReduxRouter重要的方法面试中常提的重要概念1 什么是模块化是…

【牛客 - 185B】路径数量(离散数学,长度为k的路径数量,图)

题干: 给出一个 n * n 的邻接矩阵A. A是一个01矩阵 . A[i][j]1表示i号点和j号点之间有长度为1的边直接相连. 求出从 1 号点 到 n 号点长度为k的路径的数目. 输入描述: 第1行两个数n,k (20 ≤n ≤ 30,1 ≤ k ≤ 10) 第2行至第n1行,为一个邻接矩阵 …

php mysql 菜鸟_PHP 和 MySQL 基础教程(四)

PHP 和 MySQL 基础教程(四)发布时间:2016-06-17 来源: 点击:次MySQL 中的 SQL对于 MySQL ,第一件你必须牢记的是它的每一行命令都是用分号 (;) 作为结束的,但……没有完全绝对的事,在这儿也是一样。前面我曾经讲到&…

【POJ - 1724 】ROADS (带限制的最短路 或 dfs 或 A*算法,双权值)

题干: N cities named with numbers 1 ... N are connected with one-way roads. Each road has two parameters associated with it : the road length and the toll that needs to be paid for the road (expressed in the number of coins). Bob and Alice use…

mysql 5.7.20 win64_Win10下MySQL5.7.20 Mysql(64位)解压版安装及bug修复

2、解压到某一文件夹,如“C:\Program Files\MySQL\mysql-5.7.20-winx64”3、添加环境变量(系统变量):变量名:MYSQL_HOME变量值:C:\Program Files\MySQL\mysql-5.7.20-winx64;在系统变量path原有值后添加路径&#xff1…

【CodeForces - 474D】Flowers (线性dp)

题干: We saw the little game Marmot made for Moles lunch. Now its Marmots dinner time and, as we all know, Marmot eats flowers. At every dinner he eats some red and white flowers. Therefore a dinner can be represented as a sequence of several f…

mysql事务顺序重排_MySQL事务处理及字符集和校对顺序

一、事务处理 事务处理:是一种机制,管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果。用来维护数据库的完整性。利用事务处理,可以保证一组操作不会中途停止,或作为整体执行或完全不执行(除非明确指示…

mysql权重怎么配置_mysql如何按权重查询数据啊?

楼上的回答全都会错意了,题主意思是根据权重设定随机几率,例如 A 的权重为10,B 的权重为 5,这个时候随机出现 A 的几率要比出现 B 的几率高。你可以试试这个备选方案。就是先取出权重列表再去根据权重随机出来的那个权重值&#x…

【计蒜客 - 蓝桥训练】修建公路(贪心,或运算,dp)

题干: 蒜头国有 nn 座城市,编号分别为 0,1,2,3,\ldots,n-10,1,2,3,…,n−1。编号为 xx 和 yy 的两座城市之间如果要修高速公路,必须花费 x|yx∣y 个金币,其中|表示二进制按位或。 吝啬的国王想要花最少的价格修建高速公路&#…

【计蒜客 - 蓝桥训练】阶乘位数(数学,对数运算,求阶乘位数)

题干: 蒜头君对阶乘产生了兴趣,他列出了前 1010 个正整数的阶乘以及对应位数的表: nnn!n!位数111221361424251203672037504048403205936288061036288007 对于蒜头君来说,再往后就很难计算了。他试图寻找阶乘位数的规律&#xff…

mysql win10 优化设置_windows10如何优化?系统优化设置方法

windows10如何优化?,高系统效率,尽可能提高运行速度,是我们关心的问题。以下是电脑系统优化设置的4种方法,能够有效的提高系统的使用效率和优化系统管理,我们一起来看看吧!第一招:删…

【牛客 - 368D】动态连通块(并查集+bitset优化)

题干: 小T有n个点,每个点可能是黑色的,可能是白色的。 小T对这张图的定义了白连通块和黑连通块: 白连通块:图中一个点集V,若满足所有点都是白点,并且V中任意两点都可以只经过V中的点互相到达&a…

mysql 执行计划extra_mysql执行计划explain type和extra

mysql执行计划,搞定type和extra就能优化大部分sql了。type为主,extra为辅。type:system表只有一行,MyISAM引擎。const常量连接,表最多只有一行匹配,通用用于主键或者唯一索引比较时eq_ref每次与之前的表合并…

【计蒜客 - 蓝桥训练】欧拉函数(数学,数论,模板)

题干: 在数论中,对正整数 nn,欧拉函数 \varphi (n)φ(n) 是小于等于 nn 的正整数中与 nn 互质的数的数目。 例如 \varphi (12)4φ(12)4,因为 1,5,7,111,5,7,11 均和 1212 互质。 代码框中的代码是一种求欧拉函数的实现&#xf…

spark中读取json_【spark】文件读写和JSON数据解析

1.读文件通过 sc.textFile(“file://")方法来读取文件到rdd中。val lines sc.textFile("file://")//文件地址或者HDFS文件路径本地地址"file:///home/hadoop/spark-1.6.0-bin-hadoop2.6/examples/src/main/resources/people.json"HDFS文件地址"…

【牛客 - 370B】Rinne Loves Graph(分层图最短路 或 最短路dp)

题干: Island 发生了一场暴乱!现在 Rinne 要和 Setsuna 立马到地上世界去。 众所周知:Island 是有一些奇怪的城镇和道路构成的(题目需要,游戏党勿喷),有些城镇之间用双向道路连接起来了&…