我是Kafka Streams的新手,正在使用它将主题的精确副本复制到另一个名称不同的主题中。本主题有几个分区,我的生产者正在使用自定义分区程序。预先创建的输出主题具有与输入主题相同数量的分区。
在我的应用中,我做到了(我正在使用Kotlin):
val builder = StreamsBuilder()
builder
.stream<Any, Any>(inputTopic)
.to(outputTopic)
这有效,除了分区(因为我使用的是自定义分区程序)。有没有简单的方法可以使用输入记录的相同分区将输入记录复制到输出主题?
我检查了Processor API,该API允许通过ProcessorContext
访问输入记录的分区,但是我无法手动设置输出记录的分区。
显然,我可以在接收器中使用自定义分区程序,但这将意味着对记录进行反序列化和序列化,以便使用我的自定义分区程序重新计算输出分区。
答案 0 :(得分:1)
POST
(是Produced
参数之一)具有KStream::to
作为其成员之一。
您可以尝试以下代码:
StreamPartitioner
在上面的代码中,仅使用builder.stream("input", Consumed.with(Serdes.ByteArray(), Serdes.ByteArray()))
.to("output", Produced.with(Serdes.ByteArray(), Serdes.ByteArray(), (topicName, key, value, numberOfPartitions) -> calculatePartition(topicName, key, value, numberOfPartitions));
ByteArray
,因此会发生任何特殊的序列化或反序列化。
答案 1 :(得分:-1)
首先,基于Key在各个分区之间分配消息。具有相似密钥的消息将始终位于同一分区中。
因此,如果您的消息具有密钥,那么您完全不必担心它。只要您具有与原始主题相似的分区数量;它会得到照顾。
第二,如果要将数据原样复制到另一个主题,则应考虑使用原始主题。卡夫卡有消费群体的概念。
例如,您有一个主题“交易”,那么您可以拥有一个消费群体,即“信用卡处理程序”,“抵押付款处理程序”,“苹果支付处理程序”等等。消费者组将阅读同一主题,并过滤出对他们有意义的事件并进行处理。
您还可以创建3个主题,并获得相同的结果。虽然,这不是最佳解决方案。您可以在https://kafka.apache.org/documentation/上找到更多信息。