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


主题名称提取器希望将每个任务计划发送到特定主题 , 相应的任务使用者将从中从中选择要执行的任务 。由于具有动态性质 , 因此使用TopicNameExtractor接口的实现来确定目标主题 。此实现将使用"任务定义"中的"任务配置"集返回正确的主题名称 。
public class TargetTopicNameExtractor implements TopicNameExtractor {@Overridepublic String extract(final TaskDefinitionKey taskDefinitionKey,final TaskDefinition taskDefinition,final RecordContext recordContext) {return taskDefinition.getConfig().getOutputTopic().toString();}}Kafka流拓扑Kafka Stream DSL方法用于将变压器实现连接到拓扑 。由于没有其他处理器添加到拓扑 , 因此拓扑定义看起来非常简单 。
// create a Stream Builder instancefinal StreamsBuilder streamsBuilder = new StreamsBuilder();// Create the stream to consume the tasks/tasks definitions from the tasks topicsfinal KStream keyTaskDefinitionKStream = streamsBuilder.stream(Config.TASK_SCHEDULING_INPUT_TOPIC, consumed);// add processors using DSL and PAPIkeyTaskDefinitionKStream.transform(new TaskSchedulingTransformerSupplier(), Config.TASK_STORES).to(new TargetTopicNameExtractor(), Produced.with(getTaskDefinitionKeySpecificAvroSerde(), getTaskDefinitionSpecificAvroSerde()));完成实施这篇文章简要介绍了实现 , 完整的实现可在下面的github中找到 。该github还包含一些测试实现 , 可用于生成测试任务计划 。
(本文翻译自Naveen Kumar的文章《High Available Task Scheduling — Design using Kafka and Kafka Streams》 , 参考:@cbenaveen/high-available-task-scheduling-design-using-kafka-and-kafka-streams-dcd81121d43b)