Kafka消息Header的存储位置及对应数据存储介质咨询
Kafka 消息Header存储逻辑解答
Kafka 本身的Header存储规则
- Kafka Header 是直接内嵌在消息记录的二进制编码结构中的,不属于独立的服务端元数据字段。Kafka 服务端不会单独解析、拆分存储Header内容,而是将其与消息的key、value、时间戳等属性一起作为完整消息记录的一部分,写入Broker本地磁盘的分段日志文件(即
.log后缀的持久化日志,存储路径由Broker配置项log.dirs指定),存储介质就是Broker节点的本地磁盘。 - Kafka 消息协议的二进制格式中已经预留了Header的存储块:编码时会先写入Header的总数量,再依次写入每个Header的key长度、key内容、value长度、value内容,整体序列化后和消息其他属性一起持久化,不会做单独拆分存储。
为什么Postgres的kafka_message表没有Header字段
- 你提到的Postgres库中的
kafka_message表不属于Kafka官方内置的存储组件,一般是业务侧通过Kafka Connect JDBC Sink、Debezium等同步工具,或是自定义消费转存逻辑,将Kafka消息同步写入Postgres生成的表。 - 该表的字段完全由转存逻辑的配置决定:如果同步配置没有显式声明要解析、提取Kafka Header写入对应字段,默认不会生成Header相关的存储字段,也不会同步Header内容。如果需要将Header存入Postgres,可以修改同步规则,将所有Header整体序列化为JSON/字符串存入一个通用字段,或是将需要用到的Header(比如你用到的correlation id)单独提取为独立字段存储。
补充验证方式
你可以直接用Kafka自带的消费脚本验证Header的存在,执行如下命令即可打印出Topic中原始消息的Header内容,这些内容直接从Broker本地日志读取,和你Postgres中的同步表没有关联:
kafka-console-consumer.sh --bootstrap-server <broker地址> --topic <topic名> --from-beginning --print-headers
内容的提问来源于stack exchange,提问作者Tanvi Shinde
相关产品推荐
相关产品推荐

