kafka消费者可以在从某个主题轮询所有消息之前过滤消息吗?

时间:2018-06-26 19:24:56

标签: java apache-kafka filtering producer-consumer

据说,消费者只能阅读整个主题。对经纪人进行评估以过滤消息没有运气。

这意味着我们必须使用/接收来自某个主题的所有消息,并在客户端对其进行过滤。

太多了。我想知道我们是否可以根据已经传递给代理的信息(例如msg密钥或其他信息)来过滤和接收特定类型的消息。

从Consumer.poll(timeout)方法来看,我们似乎无能为力。

3 个答案:

答案 0 :(得分:0)

否,对于使用方,您不能仅从主题接收某些消息。使用者按顺序提取所有消息。

如果您不想在使用者中过滤消息,则可以使用“流”作业。例如,Streams将从您的主题中读取内容,仅将消费者感兴趣的消息推送到另一个主题。然后,消费者可以订阅这个新主题。

答案 1 :(得分:0)

一旦记录已经被推送到Kafka集群中,您将无能为力。 无论您要过滤什么,都必须始终将数据块带到客户端。

不幸的是,唯一的选择是将逻辑传递给生产者,这样您就可以根据可以定义的特定逻辑将数据推送到多个主题中。

答案 2 :(得分:0)

每个Kafka主题都应包含逻辑上相似的消息,以保持话题主题。现在,有时可能会遇到一个主题,例如 fruits ,其中包含水果的不同属性(可能是json格式)。生产者可能会推送不同的水果消息,但希望您的一个消费群体仅处理苹果。理想情况下,您可能会使用带有单个水果名称的主题名称,但是让我们假设由于某种原因(可能过多的主题)而没有结果。在这种情况下,您可以覆盖Kafka中的默认分区方案以忽略密钥并进行随机分区,然后将自定义分区类通过生产者中的 partitioner.class 属性传递,从而msg键中的水果名称。这是必需的,因为默认情况下,如果您在发送消息时放置密钥,它将始终进入同一分区,这可能会导致分区不平衡。

其背后的想法有时是,如果您的Kafka msg值是一个复杂的对象(json,avro-record等),则与解析整个值并提取所需字段相比,基于键过滤记录可能会更快。我现在没有任何数据,以支持这种方法的性能优势。这只是一种直觉。