2014-10-30 50 views
2

我使用下面的代码写入到卡夫卡:卡夫卡压缩可以用相同的分区密钥覆盖消息吗?

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

而且我们使用0.8.1.1版本卡夫卡的。

是否有可能的是,当多个线程编写,他们中的一些(不同的有效载荷)用相同的分区键和写,因为卡夫卡覆盖这些消息(由于同一partitionKey)?

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

回答

2

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

+0

谢谢格温。但是你的回答看起来更像是一个应该如何而不是确认的建议。 我的问题更多的是关于数据没有达到消费者,因为压实。日志压缩与消息传递不同吗?日志是否可能被压缩,但客户端仍然获得具有相同密钥的所有消息? 如果此功能仅在8.1 *版本中引入,则此更改是否与先前版本不兼容? – user2250246 2014-11-03 03:39:26

+1

1.日志压缩与消息传递不同。无论是否有人正在使用消息,压缩都发生在服务器中。 – 2014-11-03 23:10:15

+2

2.如果客户在写完信息后立即读取消息,它将在压缩之前完成,他们将获得所有消息。 – 2014-11-03 23:11:45

5

我发现了一些更多的材料在https://cwiki.apache.org/confluence/display/KAFKA/Log+Compaction

要点:

  1. 之前0.8版本,卡夫卡只支持单个保持 机制:删除日志的老段
  2. 登录压实提供了一种替代使其保持每个 唯一密钥的最新条目,而不仅仅维护最近的日志条目。
  3. 有一个per-topic选项可以选择“删除”或“紧凑”。
  4. 压实保证每个关键是在 日志尾部独特。它通过从头到尾重新复制日志来工作,删除在日志中具有较晚发生的键。
  5. 任何停留在日志头部(〜1GB)的消费者都将看到所有消息。

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

缺失的记录,只有当下游客户端将无法清空卡夫卡会出现问题队列很长一段时间(如每话题尺寸/时限被击中)。

这应该是一个预期的行为,我觉得既然我们不能保存记录,直到永远。他们必须被删除一段时间或其他。

相关问题