Kafka 流过滤:代理方还是消费者方?

Kafka streams filtering: broker or consumer side?

我正在研究 kafka 流。我想使用选择性非常低(几千分之一)的过滤器来过滤我的流。我在看这个方法: https://kafka.apache.org/0100/javadoc/org/apache/kafka/streams/kstream/KStream.html#filter(org.apache.kafka.streams.kstream.Predicate)

但我找不到任何证据,如果过滤器将由消费者评估(我真的不想将大量 GB 转移给消费者,只是为了扔掉它们),或者在代理内部(是的!).

如果它是在消费者端评估的,有什么办法,如何在代理中做到这一点?

谢谢!

Kafka 不支持代理端过滤。如果您使用 Streams API,过滤将在您的应用程序中完成(谓词不会由 KafkaConsumer 评估,而是在您的拓扑结构的 "processor node" 内进行评估——即,在 Streams [=19] 内=] 运行时代码).

这可能有帮助:https://docs.confluent.io/current/streams/architecture.html

不支持broker端过滤的原因是,bro​​ker只使用(1)字节数组作为键值数据类型,并使用(2)零拷贝机制来实现高吞吐量。代理端过滤需要在代理端反序列化数据,这将是一个主要的性能损失(反序列化成本和无零拷贝优化)。

如果您想进行服务器端过滤,我建议您使用 KSQL。它支持一种很好的类似于 SQL 的机制来过滤服务器端的消息。但为此,您将不得不花费更多资源来设置 KSQL 服务器,这涉及高可用性、复制等问题。

所以如果你的消息吞吐量是小数thousands/sec那么我会使用KStreams,如果你有更大的数量和更复杂的过滤场景那么我会选择KSQL。