具体报错情况如下:
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 时,通常使用主机名的情况如下:
-
集群内部通信:当多个 Kafka 组件(如生产者、消费者、Broker 等)位于同一集群内部时,它们通常会使用主机名而不是 IP 地址来进行通信。这样做的好处是,主机名可以更方便地管理和维护,而且在网络拓扑变化时,不需要每次都更新 IP 地址。
-
动态 IP 管理:在云服务或容器化环境中,Kafka Broker 可能会被动态分配 IP 地址,而主机名则可以保持不变或由服务发现机制自动更新。这种情况下,使用主机名能够简化配置和部署。
-
负载均衡和故障转移:通过使用主机名,可以更轻松地实现负载均衡和故障转移。例如,使用负载均衡器的主机名作为 Kafka Broker 的连接点,当其中一个 Broker 失效时,负载均衡器可以自动路由流量到可用的 Broker 上。
-
服务发现:一些服务发现工具(如Consul、Etcd、ZooKeeper等)提供了动态服务注册和解析功能,使得可以通过服务名称而不是固定的 IP 地址来访问 Kafka。