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

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

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

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

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

请您参考如下方法:

我在 https://cwiki.apache.org/confluence/display/KAFKA/Log+Compaction 找到了更多资料

要点:

  1. 0.8版本之前,Kafka只支持单次retention 机制:删除旧的日志段
  2. 日志压缩提供了一种替代方法,它可以为每个条目维护最新的条目 唯一键,而不是只维护最近的日志条目。
  3. 每个主题都有一个选项可以选择“删除”或“压缩”。
  4. 压缩保证每个键在尾部都是唯一的 日志。它的工作原理是从头到尾重新复制日志,删除 稍后在日志中出现的 key 。
  5. 任何停留在日志头部 (~1GB) 内的消费者都将看到所有消息。

因此无论我们是否进行日志压缩,Kafka 都会删除较旧的记录,但日志头部的记录是安全的。

仅当下游客户端长时间无法清空 Kafka 队列(例如达到每个主题大小/时间限制)时,才会出现记录丢失问题。

我认为这应该是预期的行为,因为我们不能永远保留记录。有时必须删除它们。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!