Apache kafka 卡夫卡流:混合和匹配PAPI和DSL KTable非共分区
我有一个混合匹配的Scala拓扑,其中主要工作是一个PAPI处理器,其他部分通过DSL连接Apache kafka 卡夫卡流:混合和匹配PAPI和DSL KTable非共分区,apache-kafka,scalatest,apache-kafka-streams,embedded-kafka,Apache Kafka,Scalatest,Apache Kafka Streams,Embedded Kafka,我有一个混合匹配的Scala拓扑,其中主要工作是一个PAPI处理器,其他部分通过DSL连接 EventsProcessor: INPUT: eventsTopic OUTPUT: visitorsTopic (and others) 整个主题(包括原始eventsTopic)中的数据通过一个包含两个字段的DoubleKey进行分区。 访客通过水槽发送至visitorsTopic: .addSink(VISITOR_SINK_NAME, visitorTopicName, Double
EventsProcessor:
INPUT: eventsTopic
OUTPUT: visitorsTopic (and others)
整个主题(包括原始eventsTopic
)中的数据通过一个包含两个字段的DoubleKey
进行分区。
访客通过水槽发送至visitorsTopic
:
.addSink(VISITOR_SINK_NAME, visitorTopicName,
DoubleKey.getSerializer(), Visitor.getSerializer(), visitorSinkPartitioner, EVENT_PROCESSOR_NAME)
在DSL中,我在这个主题上创建了一个KV KTable:
val visitorTable = builder.table(
visitorTopicName,
Consumed.`with`(DoubleKey.getKafkaSerde(),
Visitor.getKafkaSerde()),
Materialized.as(visitorStoreName))
我稍后将其连接到事件处理器
:
topology.connectProcessorAndStateStores(EVENT_PROCESSOR_NAME, visitorStoreName)
所有内容都是共同分区的(通过DoubleKey)<代码>visitorSinkPartitioner执行典型的模运算:
Math.abs(partitionKey.hashCode % numPartitions)
在PAPI processor EventsProcessor中,我查询此表以查看是否已经存在访问者
但是,在我的测试中(使用,但这不会有什么区别),如果我用一个分区运行它们,一切都很好(EventsProcessor在同一个DoubleKey
上的两个事件上检查KTable,在第二个事件上-有一些延迟-它可以看到存储上存在的访问者
),但是如果我用更高的数字运行它,EventProcessor从未在存储中看到该值
但是,如果我通过API检查存储(迭代store.all()
),记录就在那里。所以我知道它一定要去不同的分区
由于KTable应该处理其分区上的数据,并且所有内容都发送到同一分区(使用调用相同代码的显式分区器),因此KTable应该在同一分区上获取该数据
我的假设正确吗?会发生什么
KafkaStreams 1.0.0,Scala 2.12.4
另外,当然可以通过PAPI而不是StreamsBuilder.table()将
放在PAPI上创建存储,因为这肯定会使用与代码运行相同的分区,但这是不可能的。是的,假设是正确的
如果它有助于任何人:
我在将分区程序传递到Scala EmbeddedKafka库时遇到问题。在其中一个测试套件中,它没有正确执行。
现在,按照重构的健康实践,我在这个拓扑的所有套件中都使用了这个方法
def getEmbeddedKafkaTestConfig(zkPort: Int, kafkaPort: Int) :
EmbeddedKafkaConfig = {
val producerProperties = Map(ProducerConfig.PARTITIONER_CLASS_CONFIG ->
classOf[DoubleKeyPartitioner].getCanonicalName)
EmbeddedKafkaConfig(kafkaPort = kafkaPort, zooKeeperPort = zkPort,
customProducerProperties = producerProperties)
}