Kafka压缩可以用相同的分区密钥覆盖消息吗?

时间:2014-10-30 01:42:23

标签: apache-kafka messaging

我正在使用以下代码写入Kafka:

String partitionKey = "" + System.currentTimeMillis();
KeyedMessage<String, String> data = new KeyedMessage<String, String>(topic, partitionKey, payload);

我们使用的是Kafka的0.8.1.1版本。

当多个线程正在写入时,其中一些(具有不同的有效负载)是否可能使用相同的分区键写入,因此Kafka会覆盖这些消息(由于相同的partitionKey)?

让我们朝这个方向思考的文档是: http://kafka.apache.org/documentation.html#compaction

2 个答案:

答案 0 :(得分:5)

我在https://cwiki.apache.org/confluence/display/KAFKA/Log+Compaction

找到了更多资料

突出点:

  1. 在0.8版本之前,Kafka仅支持一次保留 机制:删除旧的日志段
  2. 日志压缩提供了一种替代方法,以便为每个条目维护最新的条目 唯一键,而不是仅维护最近的日志条目。
  3. 有一个按主题选项可选择“删除”或“紧凑”。
  4. 压缩保证每个键在尾部都是唯一的 登录。它的工作原理是从头到尾重新复制日志,删除 在日志中稍后出现的键。
  5. 任何留在日志头部内的消费者(~1GB)都会看到所有消息。
  6. 因此,无论我们是否进行日志压缩,Kafka都会删除较旧的记录,但日志记录中的记录是安全的。

    只有当下游客户端无法长时间清空Kafka队列时(例如,每个主题大小/时间限制被命中),才会出现缺少记录问题。

    这应该是我认为的预期行为,因为我们无法永远保存记录。它们必须在某个时间或其他时间被删除。

答案 1 :(得分:2)

听起来非常可能。压缩保存每个密钥的最后一条消息。如果共享密钥有多条消息,则压缩后只保存最后一条消息。正常的用例是数据库复制,其中只有最新状态才有意思。