我有一个Kafka经纪人在我家网络的电脑上运行。当我从同一个wifi网络将我的java producer(在另一台计算机上)连接到这个代理时,它工作得非常好,能够毫无问题地发布消息。
作为下一步我的应用程序,我已经公开了我的电脑和Kafka的9092端口在互联网上。我还为此端口打开了系统上的所有防火墙。当我尝试从其他网络进行telnet/nc连接时,它连接得很好。kafka主机还显示netstat输出中的连接。
telnet DNSHOSTNAME 9092
Trying MYIP...
Connected to DNSHOSTNAME.
Escape character is '^]'.
但是从这个外部网络,当我使用完全相同的kafkajava生产者从这个外部网络发送到我的家庭计算机时,它总是失败,并出现以下错误。我在kafka日志中也没有看到任何与此相关的连接尝试或错误。
Error while producing message to topic :TP1-0@-1
org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for TP1-0: 30005 ms has passed since batch creation plus linger time
另一个有趣的地方是,我还有其他应用程序——rabbitmq和tomcat也和kafka在同一台机器上,具有相同的防火墙和路由器规则。我的同一个java应用程序能够通过tcp和http从internet连接发布给他们。只有Kafka不行。
如果telnet和nc连接连接良好,我认为这不是防火墙或网络路由问题。我只剩下下面给出的生产者代码。Kafka经纪人或Kafka制作人是否有某种类型的设置可供他们通过互联网连接?消费者代码也有同样的问题。它无法从internet连接。
生产商代码:
public static void main(String[] args){
Properties props = new Properties();
//props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "DNSHOSTNAME:9092");
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "MYEXTERNALIP:9092");
props.put(ProducerConfig.ACKS_CONFIG, "all");
props.put(ProducerConfig.RETRIES_CONFIG, 0);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
Producer<String, String> producer = new KafkaProducer<String, String>(props);
TestCallback callback = new TestCallback();
Random rnd = new Random();
ProducerRecord<String, String> data = new ProducerRecord<String, String>("TP1", "s2", "TEST DATA" );
producer.send(data, callback);
producer.close();
}
private static class TestCallback implements Callback {
@Override
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
if (e != null) {
System.out.println("Error while producing message to topic :" + recordMetadata);
e.printStackTrace();
} else {
String message = String.format("sent message to topic:%s partition:%s offset:%s", recordMetadata.topic(), recordMetadata.partition(), recordMetadata.offset());
System.out.println(message);
}
}
}
完成的故障排除步骤:
在3台不同的电脑、2个windows和1个mac上部署了kafka。同样的结果。在同一个网络上运行良好,而不是在互联网上。telnet与来自internet/外部网络的每台kafka计算机一起工作。
尝试了3个不同的外部网络,其中一个是我手机的热点。
如前所述,在Kafka机器上也试过其他软件,效果很好。
完全禁用系统防火墙只是为了确保没有防火墙问题,但没有运气。
有人能帮我解决这个问题吗?
提前谢谢!
1条答案
按热度按时间euoag5mw1#
你所描述的问题可以通过在互联网上通过
advertised.listeners
telnet和nc检查端口是否打开(listeners
配置),但无法检查代理是否正确引导回客户端,您可以改用kafkacat -L -b <bootstrap>
为此,它将返回集群中的代理列表,并且应该可以从运行客户机的位置连接到每个代理如果您的单个wan地址后面有多个代理,则它们必须播发/转发单独的端口以实现完全连接
替代方案包括kafka rest代理
无论哪种情况,都应该向连接添加ssl