يستخدم LTS (جدولة المهام الخفيفة) بشكل أساسي لحل مشكلات جدولة المهام الموزعة ويدعم المهام في الوقت الفعلي والمهام المجدولة ومهام Cron. إنها تتمتع بقابلية جيدة للتوسع والتوسع والمتانة والاستقرار وتستخدمها العديد من الشركات ونأمل أيضًا أن يتمكن المتحمسون للمصادر المفتوحة من المساهمة معًا.
عنوان جيثب: 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 (كلمة مرور المجموعة: helloworld) للمناقشة والتحسين معًا. كلما زاد عدد الأشخاص الذين يدعمونها، زاد الدافع لتحديثها، إذا أردت، تذكر أن تضع نجمة في الزاوية اليمنى العليا.
يحتوي 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 يوفر أيضًا دعمًا لـ Spring، بما في ذلك Xml والتعليقات التوضيحية، فقط أدخل lts-spring.jar
.
يتم توفير مسجل الأعمال على جانب TaskTracker لاستخدامه بواسطة التطبيقات، ومن خلال مسجل الأعمال هذا، يمكن إرسال سجلات الأعمال إلى JobTracker. ويمكن ربط سجلات الأعمال هذه بمعرفات المهام، ويمكن عرض تنفيذ المهام في الوقت الفعلي في LTS. -الجدول الزمني المشرف.
يمكن أن يحقق توسيع SPI أي تطفل، ويحتاج فقط إلى تنفيذ الواجهة المقابلة ويمكن استخدامه بواسطة واجهات التوسعة المفتوحة حاليًا
عندما يتعطل TaskTracker الذي ينفذ المهمة، سيقوم JobTracker على الفور بتخصيص جميع المهام المعينة إلى TaskTracker الذي تم إسقاطه إلى عقد TaskTracker العادية الأخرى للتنفيذ.
يمكن إجراء مراقبة الموارد ومراقبة المهام وما إلى ذلك على العقد JobTracker وTaskTracker، ويمكن عرضها في خلفية إدارة LTS-Admin في الوقت الفعلي لإجراء تخصيص معقول للموارد.
يوفر إطار عمل LTS الدعم لأربع نتائج تنفيذ، EXECUTE_SUCCESS
و EXECUTE_FAILED
و EXECUTE_LATER
و EXECUTE_EXCEPTION
، ويعتمد آليات المعالجة المقابلة لكل نتيجة، مثل إعادة المحاولة.
يتم استخدام آلية FailStore للتسامح مع خطأ العقدة ولن يؤثر Fail And Store على تشغيل التطبيق الحالي بسبب عدم استقرار الاتصال عن بعد. للحصول على تعليمات FailStore المحددة، يرجى الرجوع إلى تعليمات FailStore في وصف المفهوم.
تم إنشاء المشروع بشكل أساسي باستخدام maven، ويوفر حاليًا حزمة من نصوص shell. تبعيات البيئة: Java(jdk1.6+)
Maven
ينقسم استخدام المستخدم بشكل عام إلى نوعين:
يمكنك تحميل حزمة lts jar إلى المستودع المحلي من خلال الأمر maven. أضف المستودع المقابل في ملف pom.xml الأصلي وقم بتحميله باستخدام أمر النشر. لمعرفة طرق الاقتباس المحددة، يرجى الرجوع إلى الأمثلة في lts.
يجب تجميع كل وحدة من وحدات lts في حزمة jar منفصلة، ويجب استيراد جميع حزم تبعيات lts. للحصول على مرجع محدد لحزم الجرة، يمكنك الرجوع إلى الأمثلة في lts.
يتم توفير نسختين من البرامج النصية (cmd)windows
و (shell)linux
للتجميع والنشر:
سيؤدي تشغيل البرنامج النصي sh build.sh
أو build.cmd
في الدليل الجذر إلى إنشاء المجلد lts-{version}-bin
في الدليل dist
.
فيما يلي بنية الدليل الخاصة به، حيث يحتوي دليل bin بشكل أساسي على البرامج النصية لبدء التشغيل الخاصة بـ JobTracker وLTS-Admin. يحتوي jobtracker
على ملف تكوين JobTracker وحزمة jar التي يجب استخدامها lts-admin
هي حزمة الحرب وملف التكوين المتعلق بـ LTS-Admin. بنية الملف 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، فأنت بحاجة إلى نسخ حديقة حيوان، على سبيل المثال، تسميتها zoo2
، قم بتعديل ملف التكوين ضمن zoo2
، ثم قم بتشغيل sh jobtracker.sh zoo2 start
. يتم إنشاء سجل jobtracker-zoo.out
في مجلد السجلات.conf/lts-monitor.cfg
و conf/lts-admin.cfg
، ثم قم بتشغيل البرنامج النصي sh lts-admin.sh
أو lts-admin.cmd
ضمن bin
. سيتم إنشاء سجل lts-admin.out
في مجلد السجلات. إذا نجح بدء التشغيل، فسيتم طباعة عنوان الوصول في السجل. ويمكن للمستخدمين الوصول من خلال عنوان الوصول هذا. تتضمن حزم الجرة التي يجب استيرادها إلى lts lts-jobclient-{version}.jar
و lts-core-{version}.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 lts-tasktracker-{version}.jar
و lts-core-{version}.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 ();
}
}
وصف المعلمة
بشكل عام، هناك حاجة إلى مثيل JobClient واحد فقط في JVM. لا تقم بإنشاء مثيل JobClient جديد لكل مهمة. سيؤدي ذلك إلى إهدار الموارد بشكل كبير، لأن JobClient واحد يمكنه إرسال مهام متعددة. يحاول نفس JVM عمومًا الاحتفاظ بمثيل TaskTracker واحد فقط. إذا كان هناك المزيد من المثيلات، فقد يتسبب ذلك في إهدار الموارد. عند مواجهة TaskTracker الذي يحتاج إلى تشغيل مهام متعددة، يرجى الرجوع إلى "أداة TaskTracker واحدة تؤدي مهام متعددة" أدناه.
في بعض الأحيان، تتطلب سيناريوهات الأعمال تنفيذ مهام متعددة. قد يتساءل بعض الأشخاص عما إذا كان كل نوع مهمة يتطلب TaskTracker للتنفيذ. إجابتي هي لا. إذا كنت في JVM، فمن الأفضل استخدام TaskTracker لتشغيل مهام متعددة، لأن استخدام مثيلات TaskTracker المتعددة في JVM يعد مضيعة للموارد (بالطبع، عندما يكون لديك كمية كبيرة من المهام المحددة). ، يمكنك استخدام عقدة 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:
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's Cron، ما عليك سوى إضافة بعض التعليمات البرمجية إلى تكوين Spring للاتصال بمنصة 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 );
}
}
كل ما تبقى هو إضافة التكوين المقابل في application.properties للحصول على التفاصيل، راجع المثال ضمن حزمة com.github.ltsopensource.examples.springboot
في مثال lts.
عندما يحتوي الجهاز على بطاقتي شبكة على الشبكة الداخلية، في بعض الأحيان إذا أراد المستخدم أن تمر حركة مرور LTS عبر بطاقة الشبكة الخارجية، فإنه يحتاج إلى تغيير عنوان تعيين اسم المضيف إلى عنوان بطاقة الشبكة الخارجية في المضيف الشيء نفسه ينطبق على الشبكة الداخلية.
إذا تم تعيين معرف العقدة عند بدء العقدة، فسيقوم LTS بتعيين UUID كمعرف العقدة بشكل افتراضي، وستكون إمكانية القراءة ضعيفة، ولكن يمكن ضمان تفرد كل عقدة إذا تمكن المستخدم من ضمان تفرد العقدة المعرف بنفسه، يمكنه setIdentity
لتعيينها، على سبيل المثال، إذا تم نشر كل عقدة على جهاز (جهاز افتراضي)، فيمكن تعيين الهوية على اسم المضيف
دعم ملحقات SPI لـ JobLogger وJobQueue وما إلى ذلك.
راجع العدد رقم 389
خبرة العمل أكثر من ثلاث سنوات
متطلبات التعليم درجة البكالوريوس
المستوى المتوقع P6 (مهندس Java كبير)/P7 (خبير تقني)
المسمى الوظيفي
منصة العضوية هي المسؤولة عن نظام المستخدم لمجموعة علي بابا، وتدعم احتياجات المستخدم لمختلف خطوط الأعمال داخل المجموعة، وتدعم المستخدم وقنوات الأعمال للتعاون الخارجي للمجموعة. بما في ذلك تسجيل دخول المستخدم والترخيص، ونظام الجلسة، والتسجيل، وإدارة الحساب، وأمن الحساب والوظائف الأخرى في كل طرف، وخدمات معلومات المستخدم الأساسية، وإدارة الجلسة وبيانات الاعتماد، وما إلى ذلك، فهو أحد خطوط الإنتاج الأساسية للمجموعة، ويحمل المئات مليارات المكالمات يوميًا، وذروة QPS تصل إلى عشرات الملايين، وبنية سحابية هجينة موزعة عالميًا، وما إلى ذلك.
باعتبارك مهندس برمجيات، ستعمل على منتجاتنا الأساسية التي توفر وظائف مهمة للبنية التحتية لأعمالنا، اعتمادًا على اهتماماتك وخبراتك، قد تعمل في واحد أو أكثر من المجالات التالية: العولمة، وتجربة المستخدم، وأمن البيانات، والتعلم الآلي. والتوافر العالي للنظام والمزيد.