You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot Kafka Producer消息Key异常截断问题排查

Kafka消息Key含横杠变为"1"的原因分析

问题场景

在Spring Boot整合Kafka的应用中,将字符串类型的eventKey设置为Kafka消息的Key时,只要eventKey包含横杠"-",最终消息Key就会变成"1"。消息发送代码如下:

public Mono<SendResult<String, GenericJsonMessage>> send(final String eventKey, @Valid final ObjectRest message)
{
    requireNonNull(message, "Message can't be null");

    final GenericJsonMessage jsonMessage = TypedJsonMessage
        .jsonBuilder(ObjectRest.class)
        .build(message).toGenericJsonMessage();

    final ProducerRecord<String, GenericJsonMessage> producerRecord = new ProducerRecord<>(topicName, eventKey, jsonMessage);
    return Mono.fromCallable(() -> kafkaTemplate.send(producerRecord).get()).subscribeOn(scheduler);
}

原因解析

核心问题出在Kafka Key的序列化器配置上:

  • 未显式指定Key序列化器时,Kafka Producer默认使用IntegerSerializer。
  • IntegerSerializer的解析逻辑是读取字符串直到遇到非数字字符为止。如果eventKey以"1-"开头,它会读取到横杠前的"1"就停止解析,最终将Key序列化为整数1,因此消费端看到的Key就是"1"。

移除横杠能解决问题,是因为此时IntegerSerializer可以完整解析整个字符串为整数,但这只是临时解决方案。正确做法是显式配置Key的序列化器为StringSerializer,示例配置(application.yml):

spring:
  kafka:
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer

配置后,无论eventKey包含什么字符,都会被正确序列化为字符串类型的Key,不会出现截断问题。

内容的提问来源于stack exchange,提问作者BugsAreEverywhere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:15:28