我正在使用以下代码写入 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 找到了更多资料
要点:
- 0.8版本之前,Kafka只支持单次retention 机制:删除旧的日志段
- 日志压缩提供了一种替代方法,它可以为每个条目维护最新的条目 唯一键,而不是只维护最近的日志条目。
- 每个主题都有一个选项可以选择“删除”或“压缩”。
- 压缩保证每个键在尾部都是唯一的 日志。它的工作原理是从头到尾重新复制日志,删除 稍后在日志中出现的 key 。
- 任何停留在日志头部 (~1GB) 内的消费者都将看到所有消息。
因此无论我们是否进行日志压缩,Kafka 都会删除较旧的记录,但日志头部的记录是安全的。
仅当下游客户端长时间无法清空 Kafka 队列(例如达到每个主题大小/时间限制)时,才会出现记录丢失问题。
我认为这应该是预期的行为,因为我们不能永远保留记录。有时必须删除它们。