You need to enable JavaScript to run this app.
导航

消息查询

最近更新时间2023.11.10 17:27:42

首次发布时间2023.07.03 15:36:59

消息队列 Kafka版提供以下消息查询相关的常见问题供您参考。

FAQ 列表

为什么查询不到消息?

通过控制台查询消息时,如果出现消息成功发送,但查询不到的现象,通常由以下原因造成。

可能原因

说明

消息已过期删除

Kakfa 实例的 Topic 可设置消息保留时长,超出保留时长的消息将被后台自动删除。

开启了自动删除消息,且磁盘占用率高

如果实例开启了自动删除消息功能,且磁盘容量达到磁盘清理水位时,后端服务会自动删除旧消息以释放磁盘空间,保障实例的可用性。此时未到期的消息可能会被自动删除,导致查询不到此消息。

消息的时间戳设置错误

通过时间范围查询消息时,消息队列 Kafka版根据消息的时间戳判断消息时间,消息的时间戳属性(createTime)由客户端配置。如果发送消息时设置的时间戳错误,则可能造成查询不到消息的现象。常见场景如下:

  • 时间戳配置错误,此消息无法被查询。例如时间戳设置为 0 或者 -1。
  • 时间戳配置为过去某个时刻,此时间戳错误的消息及其前后的几条消息,都无法被查询。
  • 时间戳配置为未来某个时刻,则当下到此未来时刻期间的所有消息,即使时间戳配置正确,也无法被查询到。

消息超过保留时长之后,仍能被查询到

Topic 中的消息在服务端保存的时间已超过了指定的消息保留时长,但查询消息时,仍然能查询到此消息,说明该消息尚未被删除。

说明

  • 消息保留时长指在磁盘容量充足的情况下,消息的最长保留时间。默认值为 72 小时,取值范围为 1 小时~2160 小时。磁盘容量不足时,将根据实例的是否删除旧消息参数配置,确定是否提前删除旧的消息,以确保服务可用性。
  • 为了避免 Topic 中存储文件的碎片化现象,Topic 的分区由多个指定大小的 Segment 文件组成,每个 Segment 文件用于存放消息。默认情况下,每个 Segment 文件大小为 1GB。当 Segment 文件存储的消息大小到达 1GB 后,后台服务才会创建下一个 Segment 文件,继续存储新的消息。此外,Kafka 要求至少保留一个 Segment 文件用来存储消息。

该现象的主要原因如下:

  • 服务端根据消息保留时长删除旧消息时,以 Segment 为单位进行删除,但不会删除未达 1GB 大小的 Segment 文件。即如果消息所保存的 Segment 片段大小未超过 1GB,此 Segment 文件和其中的消息不会被删除,无论其中的消息是否已超过消息存储时长。
  • 若 Segment 片段中存在未过期的消息,即 Segment 中最大时间戳对应的消息数据仍在消息保留时长内,Kafka 服务端不会删除这个 Segment 和其中的消息。
  • 如果客户端写入消息时传入的消息时间戳(CreateTime)不合法,同样会影响 broker 服务端删除数据。例如 Topic 中存在一条 CreateTime 为一年后某个时间的消息,此消息在指定的消息保留时长后,并不会被老化删除,和此消息在同一个 Segment 文件中的消息同样不会被老化删除。

为什么消息被消费后仍保存在 Topic 中?

消息被删除的时间与消息是否已被消费无关。在磁盘容量充足的情况下,消息只有超过了已设置的消息保留时长,才会被后端服务判定为老化,并删除该消息。
建议根据业务数据量合理设置消息保留时长与实例存储空间,以免造成未老化的消息过多、大量占用磁盘空间的情况。设置消息保留时长的方式请参考修改参数配置