Kafka-消费缓慢的最佳做法

时间:2020-06-04 05:27:34

标签: apache-kafka kafka-consumer-api

我有一个用例,其中有3个Kafka使用者写一个主题,并且需要按顺序处理每个使用者中的消息。如果某个使用者有延迟,则需要早些处理的消息将被丢弃(写入条件)。因此,有没有一种方法可以保持这些消息的顺序。

1 个答案:

答案 0 :(得分:1)

消息始终在Kafka分区中排序。通常,所有属于某个键的消息都位于某个分区中(通过分区逻辑)。

我有一个用例,其中有3个Kafka消费者在撰写单个主题

我想,您是说您有3个消费者阅读一个主题

这里有2种情况:

  1. 每个使用者都获得该主题中的所有消息。
  2. 每个使用者在该主题中仅获得一部分消息(分区)。

如果是#1

您可以有3个使用者,每个使用者具有不同的group.id,以便每个使用者都可以使用所有消息集。 在这里,速度较慢的消费者不会减慢其他消费者的速度。因为每个使用者都通常在其自己的线程或进程中运行。

如果是#2

您可以拥有3个使用相同group.id的使用者,以便每个使用者都可以拥有自己的分区份额。 一个消费者消耗的消息将不会被另一个消费者消耗。 同样在这里,较慢的消费者不会减慢其他消费者的速度。因为每个使用者只会使用自己的一组分区。

在一种情况下,如果使用者之一有滞后,则会显示一条消息 需要更早处理的将被丢弃(写 条件)

Kafka中没有隐式删除,您只需要在轮询后自己删除该消息即可。

我认为,要检查滞后,您可以从consumer.endOffsets()consumer.position()开始,两者之间的差异应该会给您带来滞后。根据延迟,您可以选择删除消息。

consumer.assignment().forEach( topicPartition -> {
      long currentPos = consumer.position(topicPartition);
      long endOfPartition = consumer.endOffsets(Collections.singletonList(topicPartition)).get(topicPartition);
});