LTS(light-task-scheduler)는 주로 분산 작업 스케줄링 문제를 해결하는 데 사용되며 실시간 작업, 예약 작업 및 Cron 작업을 지원합니다. 확장성, 확장성, 견고성, 안정성이 좋아 많은 기업에서 사용하고 있으며, 오픈소스 매니아분들도 함께 기여해 주셨으면 좋겠습니다.
Github 주소: https://github.com/ltsopensource/light-task-scheduler
오시나 주소: http://git.oschina.net/hugui/light-task-scheduler
예: https://github.com/ltsopensource/lts-examples
문서 주소(업데이트 중, 나중에 우선 적용됨): https://www.gitbook.com/book/qq254963746/lts/details
두 주소가 동시에 업데이트됩니다. 관심이 있으시면 QQ 그룹: 109500214(그룹 비밀번호: hello world)에 가입하여 함께 토론하고 개선해 보세요. 더 많은 사람들이 지지할수록 업데이트하려는 동기가 더 커집니다. 원하는 경우 오른쪽 상단에 별표를 표시하는 것을 잊지 마세요.
LTS에는 주로 다음과 같은 네 가지 유형의 노드가 있습니다.
JobClient, JobTracker 및 TaskTracker 노드는 모두无状态
입니다. 로드 밸런싱과 더 큰 로드 용량을 달성하기 위해 여러 항목을 배포하고 동적으로 삭제할 수 있으며 프레임워크는 FailStore 전략을 사용하여 LTS가 우수한 내결함성을 갖도록 만듭니다.
LTS 등록 센터는 다양한 구현(Zookeeper, redis 등)을 제공합니다. 등록 센터는 노드 정보를 공개하고 마스터를 선택합니다. (Mongo 또는 Mysql) 작업 대기열 및 작업 실행 로그를 저장하고, netty 또는 mina는 기본 통신을 수행하며 fastjson, hessian2, java 등과 같은 여러 직렬화 방법을 제공합니다.
LTS는 다음과 같은 작업 유형을 지원합니다.
작업 매개변수, 작업 실행 시간 및 기타 설정의 동적 수정 지원, 백그라운드에서 작업의 동적 추가 지원, Cron 작업 일시 중지 지원, 실행 작업 수동 중지 지원(조건부), 작업 모니터링 통계 지원, 각 노드의 작업 실행 모니터링 지원 , JVM 모니터링 등
아래 그림은 표준적인 실시간 태스크 실행 과정이다.
현재 백엔드에는 ztajy에서 제공하는 간단한 인증 기능이 있습니다. 사용자 이름과 비밀번호는 auth.cfg에 있으며 사용자가 수정할 수 있습니다.
LTS는 Spring 프레임워크 없이도 수행할 수 있지만 많은 사용자 프로젝트가 Spring 프레임워크를 사용한다는 점을 고려하면 LTS는 Xml 및 주석을 포함하여 Spring에 대한 지원도 제공하므로 lts-spring.jar
만 도입하면 됩니다.
애플리케이션에서 사용할 수 있도록 TaskTracker 측에 비즈니스 로그가 제공됩니다. 이 비즈니스 로그를 JobTracker에 제출할 수 있으며, 이러한 비즈니스 로그를 작업 ID별로 연결할 수 있으며 작업 실행을 LTS에서 실시간으로 볼 수 있습니다. -관리자.
SPI 확장은 침입 방지를 달성할 수 있으며 해당 인터페이스만 구현하면 LTS에서 사용할 수 있습니다.
작업을 실행하는 TaskTracker가 다운되면 JobTracker는 다운된 TaskTracker에 할당된 모든 작업을 다른 일반 TaskTracker 노드에 즉시 할당하여 실행합니다.
JobTracker 및 TaskTracker 노드에서 리소스 모니터링, 작업 모니터링 등을 수행할 수 있으며 LTS-Admin 관리 백그라운드에서 실시간으로 확인하여 합리적인 리소스 할당을 수행할 수 있습니다.
LTS 프레임워크는 EXECUTE_SUCCESS
, EXECUTE_FAILED
, EXECUTE_LATER
및 EXECUTE_EXCEPTION
의 네 가지 실행 결과에 대한 지원을 제공하고 각 결과에 대해 재시도와 같은 해당 처리 메커니즘을 채택합니다.
FailStore 메커니즘은 노드 내결함성을 위해 사용됩니다. Fail And Store는 원격 통신의 불안정성으로 인해 현재 애플리케이션의 작동에 영향을 미치지 않습니다. 특정 FailStore 지침은 개념 설명의 FailStore 지침을 참조하십시오.
이 프로젝트는 주로 maven을 사용하여 구축되었으며 현재 쉘 스크립트 패키징을 제공하고 있습니다. 환경 종속성: Java(jdk1.6+)
Maven
사용자 사용량은 일반적으로 두 가지 유형으로 나뉩니다.
maven 명령을 통해 lts jar 패키지를 로컬 창고에 업로드할 수 있습니다. 상위 pom.xml에 해당 리포지토리를 추가하고 배포 명령을 사용하여 업로드합니다. 구체적인 인용방법은 lts.의 예시를 참고하시기 바랍니다.
lts의 각 모듈은 별도의 jar 패키지로 패키징되어야 하며 모든 lts 종속성 패키지를 가져와야 합니다. 어떤 jar 패키지에 대한 구체적인 참조는 lts의 예제를 참조할 수 있습니다.
컴파일 및 배포를 위해 (cmd)windows
및 (shell)linux
두 가지 버전 스크립트가 제공됩니다.
루트 디렉터리에서 sh build.sh
또는 build.cmd
스크립트를 실행하면 dist
디렉터리에 lts-{version}-bin
폴더가 생성됩니다.
다음은 디렉토리 구조이며, bin 디렉토리에는 주로 JobTracker 및 LTS-Admin의 시작 스크립트가 포함되어 있습니다. jobtracker
에는 JobTracker의 구성 파일이 포함되어 있으며 사용해야 하는 jar 패키지는 lts-admin
-Admin과 관련된 war 패키지 및 구성 파일입니다. lts-{version}-bin의 파일 구조
-- lts - $ { version }- bin
|-- bin
| |-- jobtracker . cmd
| |-- jobtracker . sh
| |-- lts - admin . cmd
| |-- lts - admin . sh
| |-- lts - monitor . cmd
| |-- lts - monitor . sh
| |-- tasktracker . sh
|-- conf
| |-- log4j . properties
| |-- lts - admin . cfg
| |-- lts - monitor . cfg
| |-- readme . txt
| |-- tasktracker . cfg
| |-- zoo
| |-- jobtracker . cfg
| |-- log4j . properties
| |-- lts - monitor . cfg
|-- lib
| |-- *. jar
|-- war
|-- jetty
| |-- lib
| |-- *. jar
|-- lts - admin . war
conf/zoo
아래에서 구성 파일을 직접 수정한 다음 sh jobtracker.sh zoo start
실행합니다. 두 개의 JobTracker 노드를 시작하려면 Zoo를 복사해야 합니다(예: 이름 지정). zoo2
, zoo2
아래의 구성 파일을 수정한 다음 sh jobtracker.sh zoo2 start
실행합니다. jobtracker-zoo.out
로그는 로그 폴더에 생성됩니다.conf/lts-monitor.cfg
및 conf/lts-admin.cfg
에서 구성을 수정한 다음 bin
에서 sh lts-admin.sh
또는 lts-admin.cmd
스크립트를 실행합니다. 로그 폴더에 lts-admin.out
로그가 생성됩니다. 시작에 성공하면 액세스 주소가 로그에 인쇄됩니다. 사용자는 이 액세스 주소를 통해 액세스할 수 있습니다. lts로 가져와야 하는 jar 패키지에는 lts-jobclient-{version}.jar
, lts-core-{version}.jar
및 기타 타사 종속 jar이 포함됩니다.
JobClient jobClient = new RetryJobClient ();
jobClient . setNodeGroup ( "test_jobClient" );
jobClient . setClusterName ( "test_cluster" );
jobClient . setRegistryAddress ( "zookeeper://127.0.0.1:2181" );
jobClient . start ();
// 提交任务
Job job = new Job ();
job . setTaskId ( "3213213123" );
job . setParam ( "shopId" , "11111" );
job . setTaskTrackerNodeGroup ( "test_trade_TaskTracker" );
// job.setCronExpression("0 0/1 * * * ?"); // 支持 cronExpression表达式
// job.setTriggerTime(new Date()); // 支持指定时间执行
Response response = jobClient . submitJob ( job );
< bean id = "jobClient" class = "com.github.ltsopensource.spring.JobClientFactoryBean" >
< property name = "clusterName" value = "test_cluster" />
< property name = "registryAddress" value = "zookeeper://127.0.0.1:2181" />
< property name = "nodeGroup" value = "test_jobClient" />
< property name = "masterChangeListeners" >
< list >
< bean class = "com.github.ltsopensource.example.support.MasterChangeListenerImpl" />
</ list >
</ property >
< property name = "jobFinishedHandler" >
< bean class = "com.github.ltsopensource.example.support.JobFinishedHandlerImpl" />
</ property >
< property name = "configs" >
< props >
<!-- 参数 -->
< prop key = "job.fail.store" > leveldb </ prop >
</ props >
</ property >
</ bean >
@ Configuration
public class LTSSpringConfig {
@ Bean ( name = "jobClient" )
public JobClient getJobClient () throws Exception {
JobClientFactoryBean factoryBean = new JobClientFactoryBean ();
factoryBean . setClusterName ( "test_cluster" );
factoryBean . setRegistryAddress ( "zookeeper://127.0.0.1:2181" );
factoryBean . setNodeGroup ( "test_jobClient" );
factoryBean . setMasterChangeListeners ( new MasterChangeListener []{
new MasterChangeListenerImpl ()
});
Properties configs = new Properties ();
configs . setProperty ( "job.fail.store" , "leveldb" );
factoryBean . setConfigs ( configs );
factoryBean . afterPropertiesSet ();
return factoryBean . getObject ();
}
}
lts로 가져와야 하는 jar 패키지에는 lts-tasktracker-{version}.jar
, lts-core-{version}.jar
및 기타 타사 종속 jar이 포함됩니다.
public class MyJobRunner implements JobRunner {
@ Override
public Result run ( JobContext jobContext ) throws Throwable {
try {
// TODO 业务逻辑
// 会发送到 LTS (JobTracker上)
jobContext . getBizLogger (). info ( "测试,业务日志啊啊啊啊啊" );
} catch ( Exception e ) {
return new Result ( Action . EXECUTE_FAILED , e . getMessage ());
}
return new Result ( Action . EXECUTE_SUCCESS , "执行成功了,哈哈" );
}
}
TaskTracker taskTracker = new TaskTracker ();
taskTracker . setJobRunnerClass ( MyJobRunner . class );
taskTracker . setRegistryAddress ( "zookeeper://127.0.0.1:2181" );
taskTracker . setNodeGroup ( "test_trade_TaskTracker" );
taskTracker . setClusterName ( "test_cluster" );
taskTracker . setWorkThreads ( 20 );
taskTracker . start ();
< bean id = "taskTracker" class = "com.github.ltsopensource.spring.TaskTrackerAnnotationFactoryBean" init - method = "start" >
< property name = "jobRunnerClass" value = "com.github.ltsopensource.example.support.MyJobRunner" />
< property name = "bizLoggerLevel" value = "INFO" />
< property name = "clusterName" value = "test_cluster" />
< property name = "registryAddress" value = "zookeeper://127.0.0.1:2181" />
< property name = "nodeGroup" value = "test_trade_TaskTracker" />
< property name = "workThreads" value = "20" />
< property name = "masterChangeListeners" >
< list >
< bean class = "com.github.ltsopensource.example.support.MasterChangeListenerImpl" />
</ list >
</ property >
< property name = "configs" >
< props >
< prop key = "job.fail.store" > leveldb </ prop >
</ props >
</ property >
</ bean >
@ Configuration
public class LTSSpringConfig implements ApplicationContextAware {
private ApplicationContext applicationContext ;
@ Override
public void setApplicationContext ( ApplicationContext applicationContext ) throws BeansException {
this . applicationContext = applicationContext ;
}
@ Bean ( name = "taskTracker" )
public TaskTracker getTaskTracker () throws Exception {
TaskTrackerAnnotationFactoryBean factoryBean = new TaskTrackerAnnotationFactoryBean ();
factoryBean . setApplicationContext ( applicationContext );
factoryBean . setClusterName ( "test_cluster" );
factoryBean . setJobRunnerClass ( MyJobRunner . class );
factoryBean . setNodeGroup ( "test_trade_TaskTracker" );
factoryBean . setBizLoggerLevel ( "INFO" );
factoryBean . setRegistryAddress ( "zookeeper://127.0.0.1:2181" );
factoryBean . setMasterChangeListeners ( new MasterChangeListener []{
new MasterChangeListenerImpl ()
});
factoryBean . setWorkThreads ( 20 );
Properties configs = new Properties ();
configs . setProperty ( "job.fail.store" , "leveldb" );
factoryBean . setConfigs ( configs );
factoryBean . afterPropertiesSet ();
// factoryBean.start();
return factoryBean . getObject ();
}
}
매개변수 설명
일반적으로 JVM에는 하나의 JobClient 인스턴스만 필요합니다. 하나의 JobClient가 여러 작업을 제출할 수 있으므로 각 작업에 대해 새 JobClient 인스턴스를 생성하지 마십시오. 동일한 JVM은 일반적으로 하나의 TaskTracker 인스턴스만 유지하려고 시도합니다. 인스턴스가 더 많으면 리소스 낭비가 발생할 수 있습니다. 여러 작업을 실행해야 하는 TaskTracker를 발견하면 아래의 "하나의 TaskTracker가 여러 작업을 수행합니다"를 참조하세요.
때로는 비즈니스 시나리오에서 여러 작업을 실행해야 하는 경우도 있습니다. 어떤 사람들은 각 작업 유형을 실행하려면 TaskTracker가 필요한지 묻습니다. 내 대답은 '아니요'입니다. JVM에서 여러 작업을 실행하려면 TaskTracker를 사용하는 것이 가장 좋습니다. 왜냐하면 JVM에서 여러 TaskTracker 인스턴스를 사용하는 것은 리소스 낭비이기 때문입니다(물론 특정 작업이 많은 경우). , 별도의 TaskTracker 노드를 사용하여 이 작업을 실행할 수 있습니다. 그렇다면 여러 작업을 수행하기 위해 TaskTracker를 어떻게 구현할 수 있을까요? 아래는 제가 제시한 참고 예시입니다.
/**
* 总入口,在 taskTracker.setJobRunnerClass(JobRunnerDispatcher.class)
* JobClient 提交 任务时指定 Job 类型 job.setParam("type", "aType")
*/
public class JobRunnerDispatcher implements JobRunner {
private static final ConcurrentHashMap < String /*type*/ , JobRunner >
JOB_RUNNER_MAP = new ConcurrentHashMap < String , JobRunner >();
static {
JOB_RUNNER_MAP . put ( "aType" , new JobRunnerA ()); // 也可以从Spring中拿
JOB_RUNNER_MAP . put ( "bType" , new JobRunnerB ());
}
@ Override
public Result run ( JobContext jobContext ) throws Throwable {
Job job = jobContext . getJob ();
String type = job . getParam ( "type" );
return JOB_RUNNER_MAP . get ( type ). run ( job );
}
}
class JobRunnerA implements JobRunner {
@ Override
public Result run ( JobContext jobContext ) throws Throwable {
// TODO A类型Job的逻辑
return null ;
}
}
class JobRunnerB implements JobRunner {
@ Override
public Result run ( JobContext jobContext ) throws Throwable {
// TODO B类型Job的逻辑
return null ;
}
}
일반적으로 TaskTracker를 작성할 때 JobRunner의 구현 로직이 올바른지 테스트만 하면 되지만 원격 테스트를 위해 LTS를 시작하고 싶지는 않습니다. 테스트를 용이하게 하기 위해 LTS는 JobRunner의 단축 테스트 방법을 제공합니다. com.github.ltsopensource.tasktracker.runner.JobRunnerTester
자신의 테스트 클래스에 통합하고 initContext
및 newJobRunner
메소드를 구현하기만 하면 됩니다. lts-examples의 예와 같습니다.
public class TestJobRunnerTester extends JobRunnerTester {
public static void main ( String [] args ) throws Throwable {
// Mock Job 数据
Job job = new Job ();
job . setTaskId ( "2313213" );
JobContext jobContext = new JobContext ();
jobContext . setJob ( job );
JobExtInfo jobExtInfo = new JobExtInfo ();
jobExtInfo . setRetry ( false );
jobContext . setJobExtInfo ( jobExtInfo );
// 运行测试
TestJobRunnerTester tester = new TestJobRunnerTester ();
Result result = tester . run ( jobContext );
System . out . println ( JSON . toJSONString ( result ));
}
@ Override
protected void initContext () {
// TODO 初始化Spring容器
}
@ Override
protected JobRunner newJobRunner () {
return new TestJobRunner ();
}
}
Quartz의 Cron 작업의 경우 LTS 플랫폼에 연결하려면 Spring 구성에 일부 코드만 추가하면 됩니다.
< bean class = " com.github.ltsopensource.spring.quartz.QuartzLTSProxyBean " >
< property name = " clusterName " value = " test_cluster " />
< property name = " registryAddress " value = " zookeeper://127.0.0.1:2181 " />
< property name = " nodeGroup " value = " quartz_test_group " />
</ bean >
@ SpringBootApplication
@ EnableJobTracker // 启动JobTracker
@ EnableJobClient // 启动JobClient
@ EnableTaskTracker // 启动TaskTracker
@ EnableMonitor // 启动Monitor
public class Application {
public static void main ( String [] args ) {
SpringApplication . run ( Application . class , args );
}
}
남은 것은 application.properties에 해당 구성을 추가하는 것입니다. 자세한 내용은 lts-example의 com.github.ltsopensource.examples.springboot
패키지 아래 예제를 참조하세요.
시스템의 내부 네트워크에 두 개의 네트워크 카드가 있는 경우 사용자가 LTS 트래픽이 외부 네트워크 카드를 통과하기를 원하는 경우 호스트 이름의 매핑 주소를 호스트의 외부 네트워크 카드 주소로 변경해야 합니다. 내부 네트워크도 마찬가지입니다.
노드 시작 시 노드 ID가 설정되면 LTS는 기본적으로 UUID를 노드 ID로 설정하므로 가독성은 떨어지지만 사용자가 노드의 고유성을 보장할 수 있다면 각 노드의 고유성은 보장될 수 있습니다. ID를 직접 설정하려면 setIdentity
설정할 수 있습니다. 예를 들어 각 노드가 머신(가상 머신)에 배포된 경우 ID를 호스트 이름으로 설정할 수 있습니다.
JobLogger, JobQueue 등에 대한 SPI 확장을 지원합니다.
문제#389를 참조하세요.
근무 경력은 3년 이상입니다.
교육 요건학사 학위
기대 수준 P6(수석 Java 엔지니어)/P7(기술 전문가)
직무 설명
멤버십 플랫폼은 Alibaba Group의 사용자 시스템을 담당하고 그룹 내 다양한 비즈니스 라인의 사용자 요구를 지원하며 그룹 외부 협력의 사용자 및 비즈니스 채널을 지원합니다. 사용자 로그인 및 권한 부여, 세션 시스템, 등록, 계정 관리, 계정 보안 및 각 끝의 기타 기능, 기본 사용자 정보 서비스, 세션 및 자격 증명 관리 등을 포함하여 수백 가지 제품을 보유한 그룹의 핵심 제품 라인 중 하나입니다. 매일 수십억 건의 통화량, 수천만 건의 최대 QPS, 전 세계적으로 분산된 하이브리드 클라우드 아키텍처 등
소프트웨어 엔지니어로서 귀하는 비즈니스 인프라에 중요한 기능을 제공하는 핵심 제품에 대해 작업하게 됩니다. 귀하의 관심과 경험에 따라 다음 영역 중 하나 이상에서 일할 수 있습니다: 세계화, 사용자 경험, 데이터 보안, 기계 학습 , 시스템 고가용성 등.