我有一个用例,其中有3个Kafka使用者写一个主题,并且需要按顺序处理每个使用者中的消息。如果某个使用者有延迟,则需要早些处理的消息将被丢弃(写入条件)。因此,有没有一种方法可以保持这些消息的顺序。
答案 0 :(得分:1)
消息始终在Kafka分区中排序。通常,所有属于某个键的消息都位于某个分区中(通过分区逻辑)。
我有一个用例,其中有3个Kafka消费者在撰写单个主题
我想,您是说您有3个消费者阅读一个主题
这里有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);
});