繁体   English   中英

使用 DSL KStream 到 KTable 的 Kafka Tombstoning

[英]Kafka Tombstoning with a DSL KStream to KTable Transformation

我有一个KStream<String, X>我基本上想转换为KTable<String, Y>

我能找到的使用 DSL 实现这一点的唯一方法是使用映射,分组然后减少。

val stream: KStream<String, X> = ...
val table: KTable<String, Y> = stream
  .mapValues({ value -> toYOrNull(value)})
  .groupByKey(Grouped.with(Serdes.String(), ySerde))
  .reduce(
    {old: Y?, updated: Y? -> updated},
    Materialized.`as`<String, Y, KeyValueStore<Bytes, ByteArray>>("y-store")
      .withKeySerde(Serdes.String()
      .withValueSerde(ySerde)
  )

我希望这可以处理reduceupdated的值为null但是当我使用TopologyTestDriver检查商店时,它似乎仍然具有旧版本。 我究竟做错了什么?

这是我的测试:

@Test
fun shouldDeleteFromTableWhenNull() {
  val store = testDriver.getKeyValueStore<String, Y?>("y-store")
  store.put("key", Y())

  inputTopic.pipeInput("key", anXThatMapsToANullY)

  assertThat(store.get("key")).isNull() // Fails as the old entry is still there
}

值为 null 的记录将被忽略。

根据文档,这是预期的行为: KGroupedStream::reduce(...) Java Doc

按分组键组合此流中记录的值。 忽略具有空键或值的记录

在即将发布的 Apache Kafka 2.5 版本中,添加了一个新的运算符KStream#toTable()来解决此用例(参见https://issues.apache.org/jira/browse/KAFKA-7658

在旧版本中,您需要使用非空的“代理删除值”来避免记录被删除,并让您的 reduce 函数在看到“代理删除值”时返回null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM