Kafka制作人无法通过互联网连接到经纪人如果在本地网络中充当代理,则效果良好telnet连接从internet工作

zaq34kh6  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(359)

我有一个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机器上也试过其他软件,效果很好。
完全禁用系统防火墙只是为了确保没有防火墙问题,但没有运气。
有人能帮我解决这个问题吗?
提前谢谢!

euoag5mw

euoag5mw1#

你所描述的问题可以通过在互联网上通过 advertised.listeners telnet和nc检查端口是否打开( listeners 配置),但无法检查代理是否正确引导回客户端,您可以改用 kafkacat -L -b <bootstrap> 为此,它将返回集群中的代理列表,并且应该可以从运行客户机的位置连接到每个代理
如果您的单个wan地址后面有多个代理,则它们必须播发/转发单独的端口以实现完全连接
替代方案包括kafka rest代理
无论哪种情况,都应该向连接添加ssl

相关问题