假设我有一个分区(partition-0),其中包含 4 个已提交且符合压缩条件的段。所以所有这些段都不会有任何重复数据,因为压缩是在所有 4 个段上完成的。
现在,有一个活动段仍未关闭。同时,如果消费者开始从 partition-0 读取数据,它是否也从活动段读取消息?
注意:我的目标是不向消费者提供特定键的重复数据。
假设我有一个分区(partition-0),其中包含 4 个已提交且符合压缩条件的段。所以所有这些段都不会有任何重复数据,因为压缩是在所有 4 个段上完成的。
现在,有一个活动段仍未关闭。同时,如果消费者开始从 partition-0 读取数据,它是否也从活动段读取消息?
注意:我的目标是不向消费者提供特定键的重复数据。
您的担忧是有效的,因为消费者还将读取来自活动段的消息。日志压缩并不能保证您对特定键只有一个值,而是至少有一个值。
以下是文档中介绍 Log Compaction 的方式:
日志压缩确保 Kafka 将始终为单个主题分区的数据日志中的每个消息键至少保留最后一个已知值。
但是,您可以尝试更频繁地运行压缩,以使您的活动和非压缩段尽可能小。然而,这是有代价的,因为运行压缩日志清理器会占用资源。
在主题级别有很多与日志压缩相关的配置。这是最重要的,所有细节都可以在这里查找:
但是,我非常相信您将无法保证您的消费者永远不会获得任何具有日志压缩主题的重复项。