Server&DevOps

Kafka 통신 순서

킨글 2025. 5. 10. 12:15

카프카 서버(브로커)에는 특정 코드를 "배포"하거나 "실행"하는 개념이 일반적인 애플리케이션 서버와는 다릅니다. 카프카 서버는 설치된 카프카 소프트웨어 자체를 실행하는 것입니다.

카프카 서버에는 다음과 같은 핵심 요소가 있습니다.

카프카 브로커 소프트웨어: 아파치 카프카 프로젝트에서 제공하는 핵심 실행 파일 및 라이브러리들이 설치되어 있습니다.
설정 파일: 브로커의 동작 방식, 포트, 데이터 저장 경로, 주키퍼 연결 정보 등을 정의하는 설정 파일(server.properties)이 있습니다.
데이터 저장 공간: 토픽의 파티션에 해당하는 실제 메시지 데이터가 저장되는 디스크 공간입니다.
카프카 서버에는 여러분이 작성한 Java 코드(Producer, Consumer 로직)가 직접 올라가서 실행되는 것이 아닙니다.

여러분이 작성한 Producer/Consumer 코드는 별도의 Spring 애플리케이션 서버에 배포되어 실행됩니다. 이 Spring 애플리케이션이 네트워크를 통해 카프카 서버(브로커)와 통신하는 것입니다.

카프카 통신 순서 이해하기:

카프카를 이용한 메시지 통신은 다음과 같은 순서로 이루어집니다.

1. 메시지 발생 (Producer 애플리케이션):
어떤 이벤트가 발생하여 메시지를 생성해야 할 때 (예: 사용자 주문 발생).
여러분이 작성한 Spring 애플리케이션 (프로듀서 역할) 내의 비즈니스 로직에서 KafkaTemplate 등을 사용하여 특정 토픽으로 메시지를 보냅니다.
이 메시지에는 보통 키(Key)와 값(Value, 여러분의 Java 객체 등)이 포함됩니다.


2. 메시지 전송 (Producer 애플리케이션 -> Kafka 브로커):
KafkaTemplate은 설정된 bootstrap.servers 주소를 통해 카프카 브로커 중 하나와 연결합니다.
Producer는 설정된 Serializer를 사용하여 메시지의 키와 값을 바이트 배열로 직렬화합니다.
직렬화된 메시지를 지정된 토픽의 적절한 파티션으로 보냅니다. 메시지의 키나 라운드 로빈 방식 등에 따라 파티션이 결정됩니다.


3. 메시지 저장 (Kafka 브로커):
메시지를 받은 카프카 브로커는 해당 토픽의 파티션에 메시지를 순서대로 추가하고 디스크에 저장합니다.
만약 해당 토픽에 복제(Replication)가 설정되어 있다면, 브로커는 다른 브로커들에게도 이 메시지를 복제하여 데이터의 안정성을 확보합니다.


4. 메시지 대기 (Consumer 애플리케이션):
메시지를 받아 처리해야 하는 여러분의 Spring 애플리케이션 (컨슈머 역할)은 Kafka 브로커와 연결되어 자신이 구독하는 토픽의 메시지를 기다립니다.
컨슈머는 자신이 속한 컨슈머 그룹과 할당된 파티션 정보를 브로커로부터 받습니다.

 

5.메시지 가져오기 (Consumer 애플리케이션 <- Kafka 브로커):
컨슈머는 주기적으로 (또는 필요에 따라) 자신이 할당받은 파티션에서 새로운 메시지가 있는지 브로커에게 요청(Poll)합니다 [7].
브로커는 컨슈머가 요청한 오프셋 이후의 메시지를 컨슈머에게 전달합니다.
컨슈머는 설정된 Deserializer를 사용하여 받은 바이트 배열 메시지를 원래의 데이터 형태(예: Java 객체)로 역직렬화합니다.


6. 메시지 처리 (Consumer 애플리케이션):
역직렬화된 메시지를 @KafkaListener 등으로 지정된 메소드에서 받아 비즈니스 로직에 따라 처리합니다 (예: 주문 정보 데이터베이스에 저장, 재고 감소 처리 등).
메시지 처리가 완료되면 컨슈머는 해당 메시지의 오프셋을 Kafka에 커밋하여 어디까지 처리했는지 기록합니다.
요약하자면:

카프카 서버(브로커): 메시지를 중앙에서 관리하고 저장하는 플랫폼/미들웨어 역할만 합니다. 특정 애플리케이션 코드가 실행되는 곳이 아닙니다.
Producer/Consumer 애플리케이션: 메시지를 생산하거나 소비하는 여러분의 비즈니스 로직이 담긴 별도의 애플리케이션입니다. 이 애플리케이션들이 네트워크를 통해 카프카 브로커와 통신하며 메시지를 주고받습니다.
이러한 분리된 역할 덕분에 Producer와 Consumer는 서로의 존재를 직접 알 필요 없이 Kafka 브로커를 통해서만 통신할 수 있게 되며, 시스템 간의 결합도가 낮아지고 확장성이 좋아집니다.