使用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插件配置 。
Java类层次结构使用IntelliJ生成的生成的Java类层次结构图 。
文章插图
任务处理程序为了能够在状态存储上处理任务调度和任务定义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();}
每个任务计划类型都有一个任务处理程序 。当我们定义了不同的任务计划选项时 , 每个计划选项都有一个任务处理程序 。这是任务处理程序和实现层次结构 。
文章插图
TaskHandler还将扩展Punctuator接口 , 以便能够使用Processor Context Schedule API定期调用 。
任务调度变压器转换器实现从各自的分区接收TaskDefinitionKey和TaskDefinition , 并将其委托给任务处理程序实现 。处理程序将负责将它们存储在正确的状态存储中 。
推荐阅读
- Biogen将使用Apple Watch研究老年痴呆症的早期症状
- Eyeware Beam使用iPhone追踪玩家在游戏中的眼睛运动
- 或使用天玑1000+芯片?荣耀V40已全渠道开启预约
- 苹果将推出使用mini LED屏的iPad Pro
- 手机能用多久?如果出现这3种征兆,说明“默认使用时间”已到
- 苹果有望在2021年初发布首款使用mini LED显示屏的 iPad Pro
- 笔记本保养有妙招!学会这几招笔记本再战三年
- 数据可视化三节课之二:可视化的使用
- 索尼sw77与sw55的使用差别感受
- 爆料称一加9系列与潜望式镜头无缘 继续使用普通长焦