我正在阅读最新版本的kafka中的日志压缩,我很好奇这会如何影响消费者。消费者的工作方式是否与以往一样,或者是否有获得所有最新价值的新流程?
使用'标准'Kafka主题,我使用一个使用者组来维护指向最新值的指针。但是,如果Kafka基于密钥而不是时间来保持价值,我想知道消费者群体将如何运作?
答案 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。