기존에 로컬호스트 환경에서 도커로 kafka를 연동했을 때에는 문제가 없던 것이 ec2 배포환경으로 이동하자, 스프링부트와 카프카 연동문제가 발생했다.
WARN 1 --- [ntainer#0-0-C-1] org.apache.kafka.clients.NetworkClient
: [Consumer clientId=consumer-my-consumer-group-1, groupId=my-consumer-group] Connection to node 1001 (/127.0.0.1:9092) could not be established. Broker may not be available.
해당 문제를 해결하기 위해 내가 가장 찾은 방법은 docker-compose.yml의 kafka container 환경변수에
KAFKA_ADVERTISED_HOST_NAME: <EC2_PUBLIC_IP>
를 추가하고, 스프링부트의 kafkaProcudeConfig 와 kafkaConsumerConfig의 부트스트랩 서버를 EC2의 PUBLIC_IP로 변경하는 것이다.이렇게 변경하여 진행하니 스프링부트와 카프카는 연동이 되었다.
하지만 이후에 추가적인 문제가 발생했다. 컨슈머와 프로듀서간의 통신이 되지 않는 것이다.
ERROR Error when sending message to topic chatting with key: null, value: 1 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.TimeoutException: Expiring 3 record(s) for chatting-0:120000 ms has passed since batch creation
이를 해결하기 위해 무한한 삽질을 시작했는데, 컨테이너 간 통신의 경우에는 EC2_PUBLIC_IP가 아닌 docker network의 주소를 쓰는 것인지, 아니면 container의 이름(ip)를 사용해서 연동해야하는 것인지 하나하나 다 바꿔가면서 적용해보았으나 전부 TimeoutException이 걸렸다.
문제 해결을 위해 기나긴 검색의 시간을 가졌고, 통신에 관련된 환경변수를 설정해야한다는 것을 알게 되었다.
advertiesed.listensers=PLANINTEXT://<public_ip> :9092
해당 코드를 추가하고
kafka-console-producer.sh --topic chatting --broker-list <public_ip>:9092
kafka-console-consumer.sh --topic chatting --bootstrap-server <public_ip>:9092
로 확인해보니 정상작동 하였다.
짤막하게 카프카의 통신에 대해서 공부한 것들을 정리해보겠다.
- 내부 클라이언트에서만 접속 가능하게 설정
listeners=PLAINTEXT://{사설 IP}:9092
advertised.listeners=PLAINTEXT://{사설 IP}:9092
- 외부 클라이언트에서만 접속 가능하게 설정
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://{공인 IP}:9092
- 내부/외부 클라이언트에서만 접속 가능하게 설정 1
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://{공인 IP}:9092
- 내부/외부 클라이언트에서만 접속 가능하게 설정 2
listeners=INTERNAL://{사설 IP or 0.0.0.0}:19092,EXTERNAL://0.0.0.0:9092
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
advertised.listeners=INTERNAL://{사설 IP}:19092,EXTERNAL://{공인 IP}:9092
inter.broker.listener.name=INTERNAL
PLAINTEXT :암호화되지 않는 텍스트 통신
레퍼런스
https://parkcheolu.tistory.com/196
https://soobysu.tistory.com/101
https://www.confluent.io/blog/kafka-listeners-explained/
https://velog.io/@divan/kafka-docker-%EB%A1%9C%EC%BB%AC-%EC%84%B8%ED%8C%85