在KAFKA中消费后删除消息

时间:2015-02-18 14:25:45

标签: apache-kafka kafka-consumer-api

我正在使用apache kafka来生成和使用5GB大小的文件。我想知道是否有一种方法可以在消费后自动删除主题中的消息。我有办法跟踪消费消息吗?我不想手动删除它。

5 个答案:

答案 0 :(得分:33)

在Kafka,消费者的责任是消费者的责任,这也是Kafka具有如此出色的横向可扩展性的主要原因之一。

使用高级消费者API将通过在Zookeeper中提交消耗的偏移量(或者通过特殊的Kafka主题使用更新的配置选项来跟踪消费消息)自动为您执行此操作。

简单的消费者API让您自己处理如何以及在何处跟踪消费消息。

Kafka中的消息清除是通过指定主题的保留时间或为其定义磁盘配额自动完成的,因此对于一个5GB文件的情况,在您定义的保留期过后,此文件将被删除,不论它是否被消费。

答案 1 :(得分:5)

根据我的知识,您可以通过减少存储时间来从日志中删除消耗的数据。日志的默认时间设置为 168小时,然后数据会自动从您创建的 Kafka-Topic 中删除。所以,我的建议是减少转到配置文件夹中的server.properties,并将 168 更改为最短时间。因此,在为 log.retention.hours 设置的特定时间后,它们没有数据。因此,您的问题将得到解决。

  

log.retention.hours = 168

继续编码

答案 2 :(得分:0)

您可以使用consumer_group:Kafka保证只有该组中的单个消费者才能阅读一条消息。 https://www.tutorialspoint.com/apache_kafka/apache_kafka_consumer_group_example.htm

答案 3 :(得分:0)

您不能删除使用时的Kafka消息

Kafka没有一种机制,可以在使用完消息后直接删除该消息。

我尝试执行此操作时发现的最接近的东西是this trick,但未经测试,并且设计使它不适用于最新消息:

执行此操作的潜在技巧是结合使用(a) 压缩的主题和(b)自定义分区(c)一对 拦截器。

该过程将遵循:

  1. 在写入密钥之前,使用生产者拦截器将GUID添加到密钥的末尾。
  2. 使用自定义分区程序忽略GUID进行分区
  3. 使用压缩的主题,以便随后可以通过producer.send(key + GUID,null)删除任何需要的单个消息
  4. 使用使用者拦截器在读取时删除GUID。

但是您不需要此功能。

有1个或多个消费者,并且希望他们总共只消费一次消息吗?
将它们放在同一个消费群体中。

是否要避免过多的消息填满磁盘?
根据磁盘空间和/或时间设置保留时间。

答案 4 :(得分:0)

我刚刚解决了这个问题,并构建了一个脚本,该脚本可以定期运行以将消耗的记录“标记”为已删除。 Kafka 不会立即释放空间,而是删除偏移量超出“活动”分区的分区。

https://gist.github.com/ThePsyjo/b717d2eaca2deb09b8130b3e917758f6