本文汇总消息生产、消费、查询与存储相关的常见问题。
客户端发送消息到 Kafka 实例之后,您可以通过以下方式确认消息是否发送成功。
Producer 建立的 Broker 连接数量是多少?
通常情况下,每个 Producer 会建立 2 个到 Broker 的 TCP 连接,分别用于更新元数据和发送消息。
您可以参考以下步骤查看消费中的客户端 IP 地址:
- 在顶部菜单栏中选择地域,并在选择左侧导航栏中单击实例列表。
- 在顶部页签栏中单击Group管理,页签中展示当前实例下的 Group 列表。
- 单击 Group ID,查看指定 Group 的消费状态。
- 在消费状态区域中,展开 Topic,其中消费者信息一列即为正在消费消息的客户端 IP 地址。
- 当消费者信息为空时,说明当前无客户端正在消费该分区,或者消费者使用的是第三方的 Kafka 客户端。
通过控制台查询消息时,如果出现消息成功发送,但查询不到的现象,通常由以下原因造成。
火山引擎消息队列 Kafka版支持自定义实例和 Topic 粒度的消息保留时长,磁盘容量充足时,超出指定保留时长的消息将被过期清理。消息保留时长(LogRetentionHours)默认为 72 小时,支持设置为 1~2160 小时。
调整消息保留时长的方式如下:
另外,消息队列 Kafka版通过参数磁盘清理水位提供磁盘容量阈值策略,在磁盘容量达到一定水位阈值后,消息队列 Kafka版会根据已设定的磁盘容量阈值策略,删除旧消息或暂停实例的数据写入,避免磁盘使用率达到 100% 而导致 Kafka 实例异常。在这种场景下,消息可能在未超过保留时长的情况下被提前删除,请定期关注实例的磁盘容量,在容量不足时及时升级实例规格。关于磁盘容量阈值策略的详细说明请参考磁盘容量阈值策略。
消息被删除的时间与消息是否已被消费无关。在磁盘容量充足的情况下,消息只有超过了已设置的消息保留时长,才会被后端服务判定为老化,并删除该消息。
建议根据业务数据量合理设置消息保留时长与实例存储空间,以免造成未老化的消息过多、大量占用磁盘空间的情况。设置消息保留时长的方式请参考修改参数配置。 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 的消息保留时长没有被自动同时修改,且 Topic 中已经超过新的消息保留时长的数据并没有被后台自动清理。
问题原因:修改实例的消息保留时长,不会对修改前已创建的 Topic 生效,所以不会触发后端检验并删除过期的消息。Topic 中消息的保留时长以 Topic 的参数配置为准。创建 Topic 时,您可以设置 Topic 沿用实例的消息保留时长,或另行设置此 Topic 的消息保留时长。
根据位点查询消息时,可能存在部分消息的存储时间显示为 1970。
可能原因如下:
- 客户端版本过低。建议升级客户端版本至 0.10.2 及后续版本。
- 客户端传递的时间戳(createTime)为 null。客户端应传递正确的时间戳,或选择使用服务端落盘时间。