非常奇怪的Kafka发消息MessageTimeOut错误

full kafka error log

我有一个Rust项目,需要发送kafka消息,容器化运行。我使用的是Rust 1.70版本,kafka类库使用的是rdkafka,但最近遇到一个非常奇怪的问题,我发现在没有修改任何依赖与Carogo.lock的场景下重新构建出来的镜像竟然无法发送消息。到生产后一直报错

Failed to produce kafka message: Message production error: MessageTimedOut (Local: Message timed out)

根据经验,看到这个错误绝大部分人的直觉是kafka服务没有连上导致超时,有可能是kafka的IP、端口写错了,或者有防火墙的因素。然而在我这个场景里,一个月之前构建的容器却可以正常工作,它们的配置文件一模一样。

我还进一步发现我构建的容器可以在我本机工作,但放到k8s里就失败,于是我到rdkafka的repo下提交了一个issue Production error MessageTimedOut when upgrade from 0.31 to 0.33,标题之所以写标题从0.31升级到0.33出现这个问题是在最初升级时出现问题,当时我误以为是升级导致的,后来即使我把版本降级回到0.31,使用一个月之前构建可运行的代码重新构建一次发现也无法正常工作。

这就非常奇怪了,作者写了一个简单的例子https://github.com/davidblewett/timeout_test让我在我的环境里运行一下,我用这个例子构建出来的镜像竟然可以发送消息!!!

而我的源码和作者提供的源码差别仅仅是我的Cargo.toml下的依赖添加了其它我需要使用的依赖

[dependencies]
redis = "0.23"
serde = { version = "1.0", features = ["derive"] }
serde_yaml = "0.9"
serde_json = "1"
env_logger = "0.10"
log = "0.4"
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] }
http = "0.2"
tokio-postgres = { version = "0.7", features = ["with-chrono-0_4"] }
regex = "1.4"
rand = "0.8"
rdkafka = "0.31"
anyhow = "1"

这个问题我已经耗了将近一天时间,各种方案都尝试过,但依旧没有解决。现在没有任何方向,估计是不太好解决了~,确实感受到了计算机的玄学~,截止目前我理解可能是我的依赖库里的某个底层依赖与rdkafka的依赖冲突了。

分享

TITLE: 非常奇怪的Kafka发消息MessageTimeOut错误

LINK: https://www.qttc.net/556-curious-kafka-timeout.html

NOTE: 原创内容,转载请注明出自琼台博客