阅读 98

kafka为什么有的消息的时间戳的值是-1(kafka消息顺序)

背景

我在检索消息的时候,意外发现一些消息的时间值是-1,如下:

而另外两条消息却有正常的时间。

想找下相关原因,所以查阅了一下kafka官方文档,有了相关结论。

官方说明

kafka消息的格式有多个版本,在老版本中,是没有时间戳这个字段的。

官方文档地址:Apache Kafka

按照文档说明,在0.11之前的版本中,消息的发送和存储都是在消息集合中,每条消息都有相关元数据信息,这时候消息格式有两个版本:版本0和版本1,如下:

在版本1的消息格式中,才有了消息的时间信息。 

上面的消息格式是0.11版本之前,那0.11版本及其之后呢?如下官方说明:

从0.11开始连名字都变了,在0.11之前,消息叫做message,发送的批次叫做Message Set,也就是消息集。而从0.11叫做record,发送的批次叫做Record Batch了。不过,意思还是一个意思。

也就是在0.11开始,引入了消息头信息:Record Header。

这个消息版本是叫V2了。

从文档中显示的V2消息格式,可以看到通用信息,比如压缩算法这些都已经没有了。

这是因为这个版本做了优化,把这些通用信息,都抽了出来放在外层的消息集合,不用每条消息都保存了,所以可以看到arrtibutes部分现在都是未使用状态。上面消息格式中后面跟着delta的是相对值,相对当前批次第一条计算出来的一个相对值。

源码说明

我查看了github的代码:kafka/ProducerRecord.java at 0.10.0 · apache/kafka · GitHub

在0.10版本中已经有了kafka发送消息记录的时候,已经有了时间戳字段,但是在之前的版本中却没有了。

我在下面例出来了。

0.9版本的ProdcuerRecord属性如下:

    private final String topic;     private final Integer partition;     private final K key;     private final V value; 复制代码

0.10版本如下,已经有了timestamp:

    private final String topic;     private final Integer partition;     private final K key;     private final V value;     private final Long timestamp; 复制代码

0.11版本如下,引入了消息头:

    private final String topic;     private final Integer partition;     private final Headers headers;     private final K key;     private final V value;     private final Long timestamp; 复制代码

然后一直到现在最新的3.1版本还是这样。

另外,关于这个时间字段,默认是生产者设置的创建时间,也就是当时的客户端的系统时间。这个时间类型是可以修改的,如下,默认是broker和一个属性,值是CreateTime:

也可以将这个值修改为LogAppendTime,就是broker端写入时的系统时间。

结论

如果消息的时间字段是-1,应该是客户端版本太老,使用的消息格式不支持时间字段。


作者:不识君
链接:https://juejin.cn/post/7053387560814379015


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐