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
相关产品推荐
相关产品推荐

