눈개
116
2020-08-20 15:40:12 작성 2020-08-20 15:42:33 수정됨
3
938

[apache kafka] disconnected 문제


안녕하세요! 최근 kafka를 접할 일이 생겨서 공부중에 있습니다.

그런데 서버에서 구동중인 kafka로 메시지를 발행하려고 하는중

disconnected가 떠서 난감한 상황입니다 ㅜㅜ;;

혹시나 해서 kafka API도 살펴보았는데 저와 비슷한 문제에 대한 힌트를 얻을 수 없어

이렇게 질문글을 남기게 되었습니다.


메시지 발행용 코드

package org.pubsub.pub_test_kafka;

import java.io.IOException;
import java.util.Arrays;
import java.util.Properties;
import java.util.Random;
import java.util.Scanner;

import org.apache.commons.lang3.StringUtils;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

public class Pub_Kafka_msg {


	public static void main(String[] args) throws IOException {
		
		String bootstrapServers = "0.0.0.0:9092"; // server:kafkahost

		// create Producer properties
		Properties properties = new Properties();
		properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
		properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
		properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

		// create the producer
		KafkaProducer<String, String> producer = new KafkaProducer<String, String>(properties);

		// create a producer record
		ProducerRecord<String, String> record =
			new ProducerRecord<String, String>("test", "hello world"); //server에 test topic생성되어있음

		// send data
		producer.send(record);

		// flush data
		producer.flush();

		// flush and close producer
		producer.close();
	}
}



pom.xml

<!-- kafka -->

		<dependency>
			<groupId>org.apache.kafka</groupId>
			<artifactId>kafka-clients</artifactId>
			<version>2.6.0</version>
		</dependency>

		<dependency>
			<groupId>org.apache.kafka</groupId>
			<artifactId>kafka-streams</artifactId>
			<version>2.6.0</version>
		</dependency>

		<dependency>
			<groupId>org.apache.kafka</groupId>
			<artifactId>kafka_2.13</artifactId>
			<version>2.6.0</version>
		</dependency>

		<!-- slf4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-simple</artifactId>
			<version>1.7.30</version>
		</dependency>
		
		
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.8</version>
		</dependency>



에러메세지

[kafka-producer-network-thread | producer-1] WARN org.apache.kafka.clients.NetworkClient - [Producer clientId=producer-1] Connection to node -1 (/0.0.0.0:9092) could not be established. Broker may not be available.
[kafka-producer-network-thread | producer-1] WARN org.apache.kafka.clients.NetworkClient - [Producer clientId=producer-1] Bootstrap broker 0.0.0.0:9092 (id: -1 rack: null) disconnected


혹시 저와 같은 문제를 겪으신 선배님이 계시다면 조언부탁드립니다 ㅠㅠ 감사합니다.

0
  • 답변 3

  • 초보개발자Lv1
    59
    2020-08-20 17:45:35

    접속주소가 0.0.0.0:9092 ???

    ip확인해보세요.

  • 눈개
    116
    2020-08-21 10:45:23
     

     보안을 위해 외부IP주소는 0.0.0.0으로 표기하였습니다 ^^ ㅜ
  • 눈개
    116
    2020-08-25 16:09:49

    [문제해결]
    생각보다 단순한 이유로 해당오류가 발생하였고 해결과정과 학습한 내용을 댓글로 남깁니다.

    ===========================================================================

    저의 경우 외부접속의 문제였기때문에 kafka의 server.properties 설정을 가장먼저 확인하였습니다.

    advertised.listeners=PLAINTEXT://0.0.0.0:9092

    * 0.0.0.0:9092는 server의 외부IP와 kafka의 포트번호입니다. 보안을 위하여 0.0.0.0으로 표기하였습니다.

    * advertised.listeners는 client가 server의 kafka(broker)에 접근하여 메시지를 발행하거나 소비할때  0.0.0.0:9092로 메시지에 접근하라는 일종을 알림입니다. 



    * 만약  advertised.listeners가 주석처리 되어있거나 PLAINTEXT://localhost:9092로되어있다면
    kafka는 client에게 localhost:9092에서 메시지를 발행하거나 소비하라고합니다.
    client와 server가 같다면 상관없지만 외부 client라면 localhost:9092로 접속하여도
    메시지를 발행,소비할 수 없습니다. 그렇기 때문에 꼭 server의 외부IP를 지정해야합니다.


    ==> 모든 설정이 완벽한데도 server에선 잘만 작동하는 kafka가 외부에선 접속조차 안된다면?

    저의 케이스입니다.
    외부에서 포트번호를 통해 연결하려할때 방화벽이 막기때문에 접속할 수 없는 경우입니다.
    아주 단순하게도 server의 방화벽 설정에서 [인바운드 규칙]을 추가하면 됩니다.

    [방화벽 설정에서 포트번호로 연결하는 방법]


    아주 간단한 문제였는데 돌아돌아 해결했네요^^;

    저와 같은문제로 구글링하시다가 이 페이지까지 들어오신분들이 문제를 해결하길 바라면서 작성해보았습니다.


    참고 url :

    https://medium.com/@eun9882/kafka-trouble-shooting-remote-connect-error-a7970b00ffca

    https://www.confluent.io/blog/kafka-client-cannot-connect-to-broker-on-aws-on-docker-etc/




  • 로그인을 하시면 답변을 등록할 수 있습니다.