解决 kafka.errors.KafkaTimeoutError 问题

具体报错情况如下:

Traceback (most recent call last):
  File "E:\WorkPlace\visBigData\kafka1.01\producer.py", line 27, in <module>
    result = future.get(timeout=600)
  File "E:\WorkPlace\visBigData\venv\lib\site-packages\kafka\producer\future.py", line 65, in get
    raise self.exception # pylint: disable-msg=raising-bad-type
kafka.errors.KafkaTimeoutError: KafkaTimeoutError: Batch for TopicPartition(topic='lc.kafka.test', partition=0) containing 1 record(s) expired: 60 seconds have passed since batch creation plus linger time

背景:

  • 语言:Python3.9
  • kafka库:kafka-python3
  • kafka版本:1.0.1

【背景描述】之前在Python脚本中一直使用kafka的集群IP地址访问都没有问题,最近因为环境搬迁把测试环境的kafka集群部署到了内网环境,搬迁后执行脚本就发现上面的错误。

问题排查:

 1、首先登录到kafka服务器地址,使用kafka-console-producer.sh和kafka-console-consumer.sh发送和消费消息查看是否正常,往topic='lc.kafka.test'发送消息和消费消息都没有问题,说明kafka服务端是正常的。

2、检查本地是否可以ping通kafka服务器地址,发现也可以ping通,这就有点奇怪了。。。

3、难道是因为配置文件使用的都是域名配置的原因?客户端域名解析的问题?那就把集群的域名和IP地址映射添加到本地的hosts中,我使用的是Windows,hosts位置在C:\Windows\System32\drivers\etc\hosts

再次运行,终于成功了!!!

总结:

下来网上查了一下,在访问 Kafka 时,通常使用主机名的情况如下:

  1. 集群内部通信:当多个 Kafka 组件(如生产者、消费者、Broker 等)位于同一集群内部时,它们通常会使用主机名而不是 IP 地址来进行通信。这样做的好处是,主机名可以更方便地管理和维护,而且在网络拓扑变化时,不需要每次都更新 IP 地址。

  2. 动态 IP 管理:在云服务或容器化环境中,Kafka Broker 可能会被动态分配 IP 地址,而主机名则可以保持不变或由服务发现机制自动更新。这种情况下,使用主机名能够简化配置和部署。

  3. 负载均衡和故障转移:通过使用主机名,可以更轻松地实现负载均衡和故障转移。例如,使用负载均衡器的主机名作为 Kafka Broker 的连接点,当其中一个 Broker 失效时,负载均衡器可以自动路由流量到可用的 Broker 上。

  4. 服务发现:一些服务发现工具(如Consul、Etcd、ZooKeeper等)提供了动态服务注册和解析功能,使得可以通过服务名称而不是固定的 IP 地址来访问 Kafka。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值