在本地内网测试都能发送成功,消费者也能消费到,把测试脚本发到外网的主机运行脚本出现发不出去,且没报错,后面通过Kafka发送的回调函数发现有KafkaTimeoutError:Timeout after waiting for 10 secs错误
Python测试脚本:
import json
from kafka import KafkaProducer
def send_method_bigjson(bootstrap_servers, topic_name, data):
producer = KafkaProducer(bootstrap_servers=bootstrap_servers,
value_serializer=lambda v: json.dumps(v).encode('utf-8'))
try:
future = producer.send(topic_name, data) #通过回调函数获取发送信息
record_metadata = future.get(timeout=10)
print("future对象:", record_metadata)
print("======================================================")
print("接收的topic:", record_metadata.topic)
print("partition_ID:", record_metadata.partition)
print("offset:", record_metadata.offset)
print("==========发送成功============")
except Exception as e:
print(str(e))
success = True
producer.close()
if __name__ == '__main__':
conf = {
'bootstrap_servers': '外网IP:9092',
'topic_name': 'testTopic'
}
send_method_bigjson(conf['bootstrap_servers'], conf['topic_name'], "hello world")
开始分析错误原因,是不是外网访问不到Kafka主机或者网络防火墙,端口问题,通过一系列的ping 主机和telnet端口发现并不是这些原因,查看Kafka日志也没问题,后面查到是Kafka配置的监听有误,没有配置监听外网ip的listeners
打开Kafka的server.properties配置项配置
listeners=PLAINTEXT://内网IP:9092
advertised.listeners=PLAINTEXT://外网IP或域名:9092
host.name=内网IP
advertised.host.name=外网IP或域名
advertised.listeners没有配置的话默认使用listeners的内网IP,所以通过外网生成消息发送不出去,
修改配置重启Kafka服务就能解决