我们正在构建kafka-streams应用程序,作为大型微服务架构的一部分。我们希望对向后不兼容的格式更改具有弹性,并引入了一个隔离的主题。我们找不到该库提供的任何内容,因此我们只是简单地“手动”尝试对记录进行反序列化,并在出现故障时将其转发给隔离的主题,从而使我们自己陷入困境。
轻松自在。
现在是隔离事件的重播。这应该在外部触发(例如REST调用),如果反序列化成功,则将事件移至下一个主题。
我们可以利用kafka流执行这种按需操作吗?直观地讲,它应该像builder.stream(quarantined).to(nextTopic)
一样简单。
看着处理器API,似乎没有可能停止处理。直截了当的阻止不是一个选择,因为它会影响在同一StreamThread
中运行的其他任务,并且拥有另一个KafkaStream应用程序似乎是过大的选择。
我想避免手动编码一个消费者->生产者循环,所以我也在考虑akka流kafka,但这听起来也有些过分...
有什么想法吗?
答案 0 :(得分:1)
如果我正确理解您的问题:每当触发外部REST调用时,您都想启动一个单独的流应用程序以从隔离的主题B中读取内容,尝试以某种更新的格式反序列化数据,如果成功将其推送到“好数据”主题C,并且此流应用在到达主题B的结尾时应自动停止。
在这种情况下,假设您对最后一个主题C没有排序要求,则可以在内部使用“停止标志”,KafkaStreams调用者线程可以阻止并等待,而KafkaStreams内部流线程可以设置解除阻止调用者线程以最终调用“ KafkaStreams.close()”。例如,您可以利用标点函数来检查自上一个标点周期以来是否没有新数据,这表明我们可能已经用尽了主题B的所有数据,在这种情况下,请设置该标志。
可以在Streams自己的基准测试代码中找到一个示例:https://github.com/apache/kafka/blob/trunk/streams/src/test/java/org/apache/kafka/streams/perf/SimpleBenchmark.java#L657-L673,但请注意,它不是基于标点,而是基于处理逻辑,因此检查当前已处理的数据内容,因为它确切知道“最后记录”是什么。看起来像。但是使用这种关闭锁存器的一般想法是相同的。