kafka log-compaction消耗数据

时间:2016-08-18 13:11:08

标签: java apache-kafka

我正在阅读最新版本的kafka中的日志压缩,我很好奇这会如何影响消费者。消费者的工作方式是否与以往一​​样,或者是否有获得所有最新价值的新流程?

使用'标准'Kafka主题,我使用一个使用者组来维护指向最新值的指针。但是,如果Kafka基于密钥而不是时间来保持价值,我想知道消费者群体将如何运作?

3 个答案:

答案 0 :(得分:3)

它不会影响消费者的工作方式。如果您只对每个键的最新值感兴趣并阅读整个主题,您可能仍会看到"重复"对于密钥(如果不是所有重复项都被删除,或者在最后一次压缩运行后写入新消息),那么您只关心每个密钥的最新值。

关于消费者群体:当某个主题被压缩时,会出现"漏洞"在有效抵消范围内。当您定期使用主题时,您将自动跳过这些主题。

来自https://kafka.apache.org/documentation.html#design_compactionbasics

  

另请注意,即使具有该偏移的消息已被压缩,所有偏移仍保留在日志中的有效位置;在这种情况下,此位置与日志中出现的下一个最高偏移量无法区分。例如,在上图中,偏移36,37和38都是等效位置,从任何这些偏移开始的读取将返回以38开头的消息集。

答案 1 :(得分:0)

根据我的知识,当Kafka收到'ack'时,它会更新其指针/偏移量。因此,当它收到第5条消息的ack(例如)时,它假定5&之前的所有消息。第五个也已成功处理。同样,它会更新其偏移量。 This small application描述了使用分组的消费者的用法。

答案 2 :(得分:0)

日志压缩仅触发被动日志段。

当前写入数据的文件 - 活动日志段。使用这些属性,' log.roll.ms',' log.segment.bytes' - 活动日志段可以滚动到被动日志段。

在阅读主题中的数据时,消费者应该注意从活动日志段中获取密钥的最新值。

(例如)在活动日志段中,记录将存储如下: 一个。 K1 - V1(加法) 湾K1 - V2(更新) C。 K1 - NULL(删除)

您可以找到有关日志压缩如何工作的更多详细信息here