Kafka流:当相似的ID出现在两个不同的输入分区中时,GlobalKtable中的数据将被覆盖

时间:2018-12-12 09:39:04

标签: java apache-kafka partitioning apache-kafka-streams

这是Read from ALL partitions in every instance of an application

的后续活动

要实现的目标是从每个实例的主题的所有分区中读取数据。我尝试使用GlobalKtable,这应该可以解决问题。不幸的是,生产者可以在“ data_in”的两个不同分区中发布两个相似的ID。因此,当运行两个不同的实例时,GlobalKtable将被覆盖。

我的问题是,这将如何实现?是否可以防止相似的ID出现在不同的分区中?或者至少如何防止它们出现在两个不同的实例中(我听说下面的代码在第一个KStream之后重新分区主题)

请分享一些起点(思想,步骤,教程,代码段等)

代码段

private GlobalKTable<String, theDataList> globalStream() {

   // KStream of records from data-in topic using String and theDataSerde deserializers
  KStream<String, Data> trashStream = getBuilder().stream("data_in",Consumed.with(Serdes.String(), SerDes.theDataSerde));

  // Apply an aggregation operation on the original KStream records using an intermediate representation of a KStream (KGroupedStream)
  KGroupedStream<String, Data> KGS = trashStream.groupByKey();

  Materialized<String, theDataList, KeyValueStore<Bytes, byte[]>> materialized = Materialized.as("agg-stream-store");
  materialized = materialized.withValueSerde(SerDes.theDataDataListSerde);

// Return a KTable
  KGS.aggregate(() -> new theDataList(), (key, value, aggregate) -> {
      if (!value.getValideData())
          aggregate.getList().removeIf((t) -> t.getTimestamp() <= value.getTimestamp());
      else
        aggregate.getList().add(value);
      return aggregate;
  }, materialized)
  .to("agg_data_in");

  return getBuilder().globalTable("agg_data_in");
}

0 个答案:

没有答案