인프런 커뮤니티 질문&답변

콜라환타사이다님의 프로필 이미지

작성한 질문수

실습으로 배우는 선착순 이벤트 시스템

Producer 사용하기

컨슈머 확인 테스트 실패

작성

·

420

·

수정됨

0

강의 내용대로 따라서 진행했는데 '여러명 응모' 테스트에 실패합니다. 테스트 실행 시 강의화면에서 보이는 것과 같이 kafka 관련 로그(ProducerConfig values)는 전혀 나오지 않습니다. CLI에서도 컨슈머는 아무런 메시지를 받지 못합니다... 에러 원인 파악이 전혀 안되서 강의 진도가 안나가고 있어요

docker-compose 실행부터 문제가 있어서 답변받은 내용대로 수정해서 아래와 같이 실행했습니다.

version: '2'

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    container_name: zookeeper
    environment:
      ZOOKEEPER_SERVER_ID: 1
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_INIT_LIMIT: 5
      ZOOKEEPER_SYNC_LIMIT: 2
    ports:
      - "2181:2181"

  kafka:
    image: confluentinc/cp-kafka:latest
    container_name: kafka
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0

 

 

 

producer와 consumer간에 testTopic으로 메시지 주고받는 테스트는 성공했어요.

근데 애플리케이션에서 강의내용대로 코드작성해서 메시지 날릴때는 메시지를 전혀 받지 못합니다.

docker exec -it kafka kafka-topics --bootstrap-server localhost:9092 --create --topic coupon_create

docker exec -it kafka kafka-console-consumer --topic coupon_create --bootstrap-server localhost:9092 --key-deserializer "org.apache.kafka.common.serialization.StringDeserializer" --value-deserializer "org.apache.kafka.common.serialization.LongDeserializer"

답변 2

1

혼자 공부하다가, 도움이 될까해서 정보남김니다.

인텔리제이에서 실행시에 분명 프로바이더가 localhost:9092 즉, 카프카를 호출되게 설정하였는데도 신기하게 도커ID:9092를 가르켜서 정상적으로 연결되지못하였고 원하는 로그를 콘솔창에서 보지못했습니다.

원인은 Docker 컨테이너 내부에서 실행 중인 Kafka 브로커가 컨테이너의 내부 호스트 이름을 사용하고 있기 때문에 이런 문제가 발생하는 것 같습니다. Kafka 브로커는 자체 메타데이터에 자신을 '도커아이디:9092'와 같이 컨테이너의 호스트 이름으로 보고하고 있습니다. 그러나 애플리케이션이 컨테이너 외부에서 실행되고 있다면, 'localhost:9092'를 사용해야 합니다.

이를위해 리스너설정을추가혔고, docker-compose.yml파일을 아래와같이 수정하였습니다. (주석은 보시기 편하라고넣어뒀습니다.)

version: '3' # Docker Compose 파일의 버전을 지정합니다.

services: # 서비스 섹션에서는 여러 개의 Docker 컨테이너 서비스를 정의합니다.

zookeeper: # Zookeeper 서비스 정의

image: wurstmeister/zookeeper:3.4.6 # Zookeeper 이미지를 지정합니다.

ports:

- "2181:2181" # 호스트의 2181 포트를 컨테이너의 2181 포트와 바인딩합니다.

kafka: # Kafka 서비스 정의

image: wurstmeister/kafka:2.12-2.5.0 # Kafka 이미지를 지정합니다.

ports:

- "9092:9092" # 호스트의 9092 포트를 컨테이너의 9092 포트와 바인딩합니다.

environment: # Kafka 컨테이너의 환경 변수를 설정합니다.

KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:29092,OUTSIDE://localhost:9092 # 내부 및 외부에서 접근할 수 있는 리스너 주소를 설정합니다.

KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT # 리스너의 보안 프로토콜을 매핑합니다.

KAFKA_LISTENERS: INSIDE://0.0.0.0:29092,OUTSIDE://0.0.0.0:9092 # 컨테이너 내부에서 사용할 리스너 주소를 설정합니다.

KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE # 브로커 간 통신에 사용할 리스너 이름을 지정합니다.

KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 # Kafka가 Zookeeper에 연결하기 위한 주소를 지정합니다.

volumes:

- /var/run/docker.sock:/var/run/docker.sock # Docker 소켓을 컨테이너와 공유하여 Docker 이벤트를 관리할 수 있게 합니다.

저는 이렇게 해결하였는데, 도움이되실까해서 공유드립니다.

답변 너무 감사합니다!! 참고하겠습니다!

최상용님의 프로필 이미지
최상용
지식공유자

이우송님 답변 감사드립니다!
John 님 혹시 문제가 해결되셨을지, 현재도 발생중이신지 알 수 있을까요 ?

0

안녕하세요, 인프런 AI 인턴입니다.

John님, Kafka Consumer를 통해 메시지를 수신하지 못하는 문제를 겪고 계시군요. 설명해주신 내용과 설정 파일을 바탕으로 상황을 파악해봤습니다. Producer와 Consumer 사이의 메시지 전송 테스트는 성공했지만, 실제 애플리케이션에서의 메시지 전송에는 실패하는 상황입니다.

먼저, Docker 또는 Kafka 설정이 정확히 이루어졌는지, Consumer가 올바르게 설정된 리스너를 통해 Kafka로부터 메시지를 받을 준비가 되어 있는지 확인하는 것이 중요합니다.

설정에서 특히 주목해야 할 부분은 KAFKA_ADVERTISED_LISTENERS입니다. 여기서 지정한 주소는 Kafka 클라이언트(Producer와 Consumer)가 커뮤니케이션하는 데 사용됩니다. 현재 설정에서는 PLAINTEXT://localhost:29092,PLAINTEXT_HOST://localhost:9092로 되어 있는데, 이 설정이 애플리케이션에서 사용하는 Kafka 클라이언트와 일치하는지 확인해보시기 바랍니다.

그리고 실습 코드 저장소를 공유해 주셨는데, 해당 코드 내 Kafka 설정이 Docker 컨테이너 설정과 정확히 일치하는지, 특히 Producer나 Consumer 설정 부분에서 bootstrap.serverslocalhost:9092 또는 도커 네트워크 내의 Kafka 서비스 이름과 포트로 올바르게 지정되었는지 확인이 필요합니다.

유사한 상황에서 도움이 될 수 있는 기존 답변을 참고하시기 바랍니다:

  • “컨슈머 확인 테스트 실패”에서 Kafka Consumer 설정에서 숫자가 출력되지 않는 문제를 겪은 유사한 사례를 다루고 있습니다. 해당 답변에서는 key-deserializervalue-deserializer 설정을 점검하라는 조언이 있습니다.

현재 사례와 유사하게, Kafka Producer와 Consumer 사이의 메시지 교환에서 문제가 발생했을 때, 설정 값들과 애플리케이션 내 Kafka 사용 부분을 세심하게 검토해야 합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.