返回

一个困扰了我数日的 Kafka Bug

后端

引言

最近在潜心钻研 Apache Kafka 的源代码时,我遇到了一个让我百思不得其解的问题,困扰了我好几天。我曾试图寻找答案,但互联网上似乎没有太多相关的讨论。因此,我决定抛砖引玉,将这个谜题分享给大家,希望能够集思广益,共同揭开它的真面目。

症状

我遇到的问题表现在 Kafka 生产者无法正确处理消息批次上的。具体而言,当生产者尝试发送一个包含多个消息的大批次时,会发生以下情况:

  • 部分消息成功发送到 Kafka 集群。
  • 剩余的消息失败,并在生产者日志中记录以下错误消息:
[ERROR] Failed to send message to topic xxx-xxx-xxx partition xxx due to failed serialization attempt: org.apache.kafka.common.errors.SerializationException: Error writing to buffer

成因分析

经过仔细研究,我发现问题的根源在于生产者在处理批次时的一个编码错误。当生产者试图将消息批次序列化为网络字节时,它会遇到一个 java.io.UTFDataFormatException ,该异常表示正在写入缓冲区的字节与 UTF-8 编码不兼容。

更具体地说,错误发生在 org.apache.kafka.common.record.Records#write 方法中,该方法负责将消息批次编码为字节。在该方法中,有一个 try-catch 块,用于处理 UTFDataFormatException,如果发生此异常,它将重新抛出 SerializationException,并附带原始异常作为原因。

潜在的 Bug

我推测这是一个 Bug,原因如下:

  • 导致 UTFDataFormatException 的根本原因没有得到解决。
  • SerializationException 的错误消息没有提供足够的信息来帮助调试问题。
  • 重新抛出 SerializationException 会导致生产者日志中出现令人困惑的错误消息,从而给问题排查带来困难。

讨论和建议的解决方案

我认为可以通过以下方式解决此问题:

  • Records#write 方法中修改错误处理逻辑,以捕获 UTFDataFormatException 的根本原因,并在生产者日志中记录更详细的错误消息。
  • 更改 SerializationException 的错误消息,以反映导致编码失败的实际原因。

欢迎大家分享你们的见解、经验和建议的解决方案。让我们共同努力,揭开这个 Kafka Bug 之谜,并为社区做出贡献。

关键词