LTS (penjadwal tugas ringan) terutama digunakan untuk memecahkan masalah penjadwalan tugas terdistribusi dan mendukung tugas waktu nyata, tugas terjadwal, dan tugas Cron. Ini memiliki skalabilitas, skalabilitas, ketahanan dan stabilitas yang baik dan digunakan oleh banyak perusahaan. Kami juga berharap para penggemar open source dapat berkontribusi bersama.
Alamat Github: https://github.com/ltsopensource/light-task-scheduler
alamat oschina: http://git.oschina.net/hugui/light-task-scheduler
Contoh: https://github.com/ltsopensource/lts-examples
Alamat dokumen (sedang diperbarui, ini akan berlaku nanti): https://www.gitbook.com/book/qq254963746/lts/details
Kedua alamat akan diperbarui secara bersamaan. Jika anda berminat silahkan bergabung dengan grup QQ: 109500214 (password grup: hello world) untuk berdiskusi dan berkembang bersama. Semakin banyak orang mendukungnya, semakin besar motivasi untuk memperbaruinya. Jika Anda suka, ingatlah untuk memberi bintang di sudut kanan atas.
LTS terutama memiliki empat jenis node berikut:
Node JobClient, JobTracker, dan TaskTracker semuanya无状态
. Beberapa yang dapat diterapkan dan dihapus secara dinamis untuk mencapai penyeimbangan beban dan kapasitas beban yang lebih besar, dan kerangka kerja ini menggunakan strategi FailStore untuk membuat LTS memiliki toleransi kesalahan yang baik.
Pusat pendaftaran LTS menyediakan banyak implementasi (Zookeeper, redis, dll.). Pusat pendaftaran memaparkan informasi node dan memilih master. (Mongo atau Mysql) menyimpan antrian tugas dan log eksekusi tugas, netty atau mina melakukan komunikasi yang mendasarinya, dan menyediakan beberapa metode serialisasi seperti fastjson, hessian2, java, dll.
LTS mendukung jenis tugas:
Mendukung modifikasi dinamis parameter tugas, waktu pelaksanaan tugas, dan pengaturan lainnya, mendukung penambahan tugas secara dinamis di latar belakang, mendukung penangguhan tugas Cron, mendukung penghentian manual pelaksanaan tugas (bersyarat), mendukung statistik pemantauan tugas, mendukung pemantauan eksekusi tugas setiap node , Pemantauan JVM, dll.
Gambar di bawah adalah proses eksekusi tugas real-time standar.
Saat ini, backend memiliki fungsi otentikasi sederhana yang disediakan oleh ztajy. Nama pengguna dan kata sandi ada di auth.cfg dan dapat diubah oleh pengguna.
LTS dapat melakukannya tanpa kerangka Spring sama sekali, tetapi mengingat banyak proyek pengguna menggunakan kerangka Spring, LTS juga menyediakan dukungan untuk Spring, termasuk Xml dan anotasi, cukup perkenalkan lts-spring.jar
.
Pencatat bisnis disediakan di sisi TaskTracker untuk digunakan oleh aplikasi. Melalui pencatat bisnis ini, log bisnis dapat dikirimkan ke JobTracker. Log bisnis ini dapat digabungkan dengan ID tugas, dan pelaksanaan tugas dapat dilihat secara real time di LTS. -Admin.jadwal.
Ekspansi SPI dapat mencapai nol intrusi. Hanya perlu mengimplementasikan antarmuka yang sesuai dan dapat digunakan oleh LTS
Ketika TaskTracker yang menjalankan tugas tidak berfungsi, JobTracker akan segera mengalokasikan semua tugas yang ditetapkan ke TaskTracker yang tidak berfungsi ke node TaskTracker normal lainnya untuk dieksekusi.
Pemantauan sumber daya, pemantauan tugas, dll. dapat dilakukan pada node JobTracker dan TaskTracker, dan dapat dilihat di latar belakang manajemen LTS-Admin secara real-time untuk melakukan alokasi sumber daya yang wajar.
Kerangka kerja LTS menyediakan dukungan untuk empat hasil eksekusi, EXECUTE_SUCCESS
, EXECUTE_FAILED
, EXECUTE_LATER
, dan EXECUTE_EXCEPTION
, dan mengadopsi mekanisme pemrosesan yang sesuai untuk setiap hasil, seperti mencoba ulang.
Mekanisme FailStore digunakan untuk toleransi kesalahan node. Fail And Store tidak akan mempengaruhi pengoperasian aplikasi saat ini karena ketidakstabilan komunikasi jarak jauh. Untuk instruksi FailStore tertentu, lihat instruksi FailStore dalam deskripsi konsep.
Proyek ini sebagian besar dibangun menggunakan pakar, dan saat ini menyediakan pengemasan skrip shell. Ketergantungan lingkungan: Java(jdk1.6+)
Maven
Penggunaan pengguna secara umum dibagi menjadi dua jenis:
Anda dapat mengunggah paket lts jar ke gudang lokal melalui perintah maven. Tambahkan repositori yang sesuai di pom.xml induk dan unggah dengan perintah penerapan. Untuk metode kutipan tertentu, silakan lihat contoh di lts.
Setiap modul lts perlu dikemas ke dalam paket jar terpisah, dan semua paket ketergantungan lts perlu diimpor. Untuk referensi spesifik tentang paket jar mana, Anda dapat merujuk pada contoh di lts.
Dua skrip versi disediakan (cmd)windows
dan (shell)linux
untuk kompilasi dan penerapan:
Menjalankan skrip sh build.sh
atau build.cmd
di direktori root akan menghasilkan folder lts-{version}-bin
di direktori dist
.
Berikut ini adalah struktur direktorinya, di mana direktori bin terutama berisi skrip startup JobTracker dan LTS-Admin. jobtracker
berisi file konfigurasi JobTracker dan paket jar yang perlu digunakan. lts-admin
adalah paket perang dan file konfigurasi yang terkait dengan LTS-Admin. Struktur file 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
, lalu jalankan sh jobtracker.sh zoo start
. Jika Anda ingin memulai dua node JobTracker, Anda perlu menyalin sebuah kebun binatang, misalnya, beri nama zoo2
, ubah file konfigurasi di bawah zoo2
, lalu jalankan sh jobtracker.sh zoo2 start
. Log jobtracker-zoo.out
dibuat di folder logs.conf/lts-monitor.cfg
dan conf/lts-admin.cfg
, lalu jalankan skrip sh lts-admin.sh
atau lts-admin.cmd
di bawah bin
. Log lts-admin.out
akan dibuat di folder logs. Jika startup berhasil, alamat akses akan dicetak di log. Paket jar yang perlu diimpor ke lts termasuk lts-jobclient-{version}.jar
, lts-core-{version}.jar
dan jar lain yang bergantung pada pihak ketiga.
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 ();
}
}
Paket jar yang perlu diimpor ke lts termasuk lts-tasktracker-{version}.jar
, lts-core-{version}.jar
dan toples lain yang bergantung pada pihak ketiga.
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 ();
}
}
Deskripsi parameter
Umumnya, hanya satu instans JobClient yang diperlukan dalam JVM. Jangan membuat instans JobClient baru untuk setiap tugas. Hal ini akan sangat membuang sumber daya, karena satu JobClient dapat mengirimkan banyak tugas. JVM yang sama umumnya mencoba mempertahankan hanya satu instance TaskTracker. Jika terdapat lebih banyak instance, hal ini dapat menyebabkan pemborosan sumber daya. Saat menemukan TaskTracker yang perlu menjalankan banyak tugas, lihat "Satu TaskTracker Melakukan Banyak Tugas" di bawah.
Terkadang, skenario bisnis memerlukan pelaksanaan beberapa tugas. Beberapa orang mungkin bertanya apakah setiap jenis tugas memerlukan TaskTracker untuk dijalankan. Jawaban saya adalah tidak. Jika Anda menggunakan JVM, yang terbaik adalah menggunakan TaskTracker untuk menjalankan banyak tugas, karena menggunakan beberapa instance TaskTracker di JVM adalah pemborosan sumber daya (tentu saja, bila Anda memiliki sejumlah besar tugas tertentu). , Anda dapat menggunakan node TaskTracker terpisah untuk menjalankan tugas ini). Jadi bagaimana kita bisa mengimplementasikan TaskTracker untuk melakukan banyak tugas? Di bawah ini adalah contoh referensi yang saya berikan.
/**
* 总入口,在 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 ;
}
}
Umumnya, saat menulis TaskTracker, Anda hanya perlu menguji apakah logika implementasi JobRunner sudah benar, namun Anda tidak ingin memulai LTS untuk pengujian jarak jauh. Untuk memfasilitasi pengujian, LTS menyediakan metode pengujian pintasan JobRunner. Cukup integrasikan com.github.ltsopensource.tasktracker.runner.JobRunnerTester
ke dalam kelas pengujian Anda sendiri, dan terapkan metode initContext
dan newJobRunner
. Seperti contoh di 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 ();
}
}
Untuk tugas Cron Quartz, Anda hanya perlu menambahkan beberapa kode ke konfigurasi Spring untuk terhubung ke platform LTS.
< 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 );
}
}
Yang tersisa hanyalah menambahkan konfigurasi yang sesuai di application.properties. Untuk detailnya, lihat contoh di bawah paket com.github.ltsopensource.examples.springboot
di lts-example.
Ketika mesin memiliki dua kartu jaringan di jaringan internal, terkadang jika pengguna ingin lalu lintas LTS melalui kartu jaringan eksternal, maka ia perlu mengubah alamat pemetaan dari nama host ke alamat kartu jaringan eksternal di host tersebut hal yang sama berlaku untuk jaringan internal.
Jika ID node disetel saat node dimulai, LTS akan menetapkan UUID sebagai ID node secara default. Keterbacaannya akan buruk, tetapi keunikan setiap node dapat dijamin jika pengguna dapat memastikan keunikan node ID sendiri, dia dapat mengatur setIdentity
, misalnya jika setiap node dikerahkan pada mesin (mesin virtual), maka identitas dapat diatur ke nama host
Mendukung ekstensi SPI untuk JobLogger, JobQueue, dll.
Lihat edisi#389
Pengalaman kerja lebih dari tiga tahun
Persyaratan pendidikanGelar sarjana
Tingkat harapan P6 (insinyur senior Java)/P7 (ahli teknis)
Deskripsi pekerjaan
Platform keanggotaan bertanggung jawab atas sistem pengguna Grup Alibaba, mendukung kebutuhan pengguna berbagai lini bisnis dalam grup, dan mendukung pengguna dan saluran bisnis kerja sama eksternal grup. Termasuk login & otorisasi pengguna, sistem sesi, registrasi, manajemen akun, keamanan akun dan fungsi lainnya di setiap ujungnya, layanan informasi pengguna yang mendasari, manajemen sesi dan kredensial, dll., ini adalah salah satu lini produk inti grup, yang membawa ratusan miliaran volume panggilan setiap hari, QPS puncak puluhan juta, dan arsitektur cloud hybrid yang didistribusikan secara global, dll.
Sebagai Insinyur Perangkat Lunak, Anda akan mengerjakan produk inti kami yang menyediakan fungsionalitas penting untuk infrastruktur bisnis kami. Bergantung pada minat dan pengalaman Anda, Anda dapat bekerja di satu atau lebih bidang berikut: Globalisasi, Pengalaman pengguna, keamanan data, pembelajaran mesin. , ketersediaan tinggi sistem, dan banyak lagi.