我用下面的代码来写Kafka:
String partitionKey = "" + System.currentTimeMillis();
KeyedMessage<String, String> data = new KeyedMessage<String, String>(topic, partitionKey, payload);
我们使用的是Kafka的0.8.1.1版本。
有没有可能当多个线程正在写入时,其中一些线程(具有不同的负载)使用相同的分区密钥写入,并且因为kafka覆盖了这些消息(由于相同的分区密钥)?
促使我们朝这个方向思考的文件是:http://kafka.apache.org/documentation.html#compaction
2条答案
按热度按时间dddzy1tm1#
我在那找到了更多的材料https://cwiki.apache.org/confluence/display/kafka/log+compaction
要点:
在0.8版本之前,kafka只支持一种保留机制:删除日志的旧段
日志压缩提供了一种替代方法,它可以为每个唯一密钥维护最近的条目,而不是只维护最近的日志条目。
每个主题都有一个选项,可以选择“删除”或“压缩”。
压缩保证每个密钥在日志尾部是唯一的。它的工作原理是从头到尾重新复制日志,删除日志中稍后出现的键。
任何停留在日志头(~1gb)内的使用者都将看到所有消息。
因此,无论我们是否有日志压缩,Kafka都会删除较旧的记录,但是日志头中的记录是安全的。
只有当下游客户机很长时间无法清空kafka队列时(例如达到每个主题的大小/时间限制),才会出现缺少记录的问题。
我认为这应该是一种预期的行为,因为我们不能永远保存记录。总有一天他们会被删除的。
3htmauhk2#
听起来很有可能。 压缩保存每个键的最后一条消息。如果有多条消息共享一个密钥,则压缩后只保存最后一条。通常的用例是数据库复制,其中只有最新的状态是有趣的。