使用Kafka和Kafka Stream设计高可用任务调度( 二 )

任务定义实际任务定义作为需要计划的任务发送到Kafka Cluster 。该模式将使用"任务配置"和"频率"来微调执行属性 。客户ID字段将帮助我们为不同的客户创建相同的任务 。
// task definition{"namespace": "org.cbenaveen.task.scheduling","type": "record","name": "TaskDefinition","fields": [{"name": "customerId","type": "string"},{"name": "taskName","type": "string"},{"name": "frequency","type": ["null", "TaskFrequency"], "default": null},{"name": "config", "type": "TaskConfiguration"},{"name": "data","type": [ "null",{"type": "map","values": "string"}], "default": null}]}任务定义键将定义发送到Kafka集群时将用作键的复杂对象 。客户ID和任务名称的组合将有助于区分同一类型的任务从一个客户到另一个客户 。
// task definition key{"namespace": "org.cbenaveen.task.scheduling","type": "record","name": "TaskDefinitionKey","fields": [{"name": "customerId","type": "string"},{"name": "taskName","type": "string"}]}生成的Java类在编译期间 , 将使用avro-maven-plugin插件将上述所有avro模式用于生成Java Pojo对象 。以下是实际的Maven Avro插件配置 。
org.apache.avroavro-maven-plugin1.8.2generate-sourcesschema${project.basedir}/src/main/resources/schemas/${project.basedir}/src/main/generated/${project.basedir}/src/main/resources/schemas/task-config.avsc${project.basedir}/src/main/resources/schemas/frequency-timeunit.avsc${project.basedir}/src/main/resources/schemas/task-frequency.avsc${project.basedir}/src/main/resources/schemas/task-definition.avscJava类层次结构使用IntelliJ生成的生成的Java类层次结构图 。
使用Kafka和Kafka Stream设计高可用任务调度文章插图
任务处理程序为了能够在状态存储上处理任务调度和任务定义CRUD , 定义了任务处理程序接口 。
package org.cbenaveen.task.scheduling.handiling;import org.cbenaveen.task.scheduling.TaskDefinition;import org.cbenaveen.task.scheduling.TaskDefinitionKey;import java.util.concurrent.TimeUnit;public interface TaskHandler {void add(final TaskDefinitionKey taskDefinitionKey, final TaskDefinition taskDefinition);TaskDefinition get(final TaskDefinitionKey taskDefinitionKey);TaskDefinition delete(final TaskDefinitionKey taskDefinitionKey);TimeUnit handlingDuration();}每个任务计划类型都有一个任务处理程序 。当我们定义了不同的任务计划选项时 , 每个计划选项都有一个任务处理程序 。这是任务处理程序和实现层次结构 。
使用Kafka和Kafka Stream设计高可用任务调度文章插图
TaskHandler还将扩展Punctuator接口 , 以便能够使用Processor Context Schedule API定期调用 。
任务调度变压器转换器实现从各自的分区接收TaskDefinitionKey和TaskDefinition , 并将其委托给任务处理程序实现 。处理程序将负责将它们存储在正确的状态存储中 。


推荐阅读