이번 강의에서는 프로듀서가 Kafka 서버로 메시지를 보내는 과정과 컨슈머가 Kafka 서버로부터 메시지를 읽어들이는 과정을 자세히 설명하겠습니다.
1. 프로듀서 측 동작 과정
-
프로듀서 설정:
- 먼저, 애플리케이션 내에서 프로듀서를 설정해야 합니다. 이 과정에서는 Kafka 브로커의 엔드포인트 URL, 메시지의 직렬화 형식, 압축 또는 배치 설정 등의 구성 요소를 설정하게 됩니다.
-
토픽 선택:
- 프로듀서가 메시지를 Kafka로 전송하려면, 전송할 토픽을 선택해야 합니다. 만약 지정한 토픽이 존재하지 않는다면, Kafka 브로커 설정에 따라 동적으로 생성될 수 있습니다.
-
메시지 전송:
- 프로듀서는 Kafka 클라이언트 라이브러리 API를 사용하여 메시지를 전송합니다. 이때, 대상 토픽과 직렬화된 메시지, 그리고 필요하다면 파티션 키를 지정하여 메시지를 전송합니다.
-
파티션 할당:
- Kafka 브로커가 메시지를 받으면, 메시지를 저장할 파티션을 결정합니다. 만약 프로듀서가 파티션 키를 제공한 경우, 해당 키에 따라 파티션을 할당하며, 그렇지 않은 경우에는 라운드 로빈이나 해싱 알고리즘 등을 사용하여 파티션을 고르게 분배합니다.
-
오프셋 할당:
- Kafka는 메시지에 오프셋 ID를 할당하고, 해당 파티션에 메시지를 추가합니다. 이 오프셋 ID는 메시지를 고유하게 식별하는 역할을 합니다.
-
메시지 복제:
- 만약 메시지 복제를 활성화한 경우, Kafka 브로커는 메시지를 다른 브로커에 복제합니다. 이 복제는 비동기 또는 동기 방식으로 이루어질 수 있습니다.
-
프로듀서에게 확인 응답:
- 메시지 복제가 완료되면, Kafka 브로커는 프로듀서에게 확인 응답(acknowledgment)을 보냅니다. 만약 오류가 발생하면, 프로듀서에게 이를 알리고, 프로듀서는 필요에 따라 재시도 로직을 수행할 수 있습니다.
2. 컨슈머 측 동작 과정
-
컨슈머 그룹 가입 및 토픽 구독:
- 컨슈머는 특정 토픽을 구독하기 위해 컨슈머 그룹에 가입해야 합니다. 각 컨슈머는 하나 이상의 토픽을 구독할 수 있으며, 이를 통해 처리할 메시지를 지정합니다.
-
파티션 할당:
- Kafka는 구독된 토픽의 파티션을 컨슈머 그룹 내의 컨슈머들에게 할당합니다. 각 파티션은 그룹 내에서 하나의 컨슈머만 처리할 수 있으며, 이를 통해 파티션 간의 균형 잡힌 처리와 병렬 처리가 가능합니다.
-
오프셋 관리:
- 컨슈머는 각 파티션에 대한 오프셋 번호를 관리하여, 자신이 처리한 메시지의 진행 상황을 추적합니다. 이는 컨슈머가 재시작되거나 실패할 경우, 마지막으로 처리한 위치에서부터 다시 시작할 수 있게 합니다.
-
메시지 요청 (Fetch Request):
- 컨슈머는 Kafka 브로커에 메시지를 요청하며, 이때 구독된 토픽, 파티션, 오프셋 번호 등을 지정합니다. 또한, 한 번에 가져올 메시지의 수를 지정하여 여러 메시지를 한 번에 처리할 수 있습니다.
-
메시지 수신 및 처리:
- Kafka 브로커는 요청받은 메시지를 파티션에서 가져와 컨슈머에게 전달합니다. 컨슈머는 전달받은 메시지를 비즈니스 로직에 따라 처리합니다.
-
오프셋 커밋:
- 메시지 처리가 완료되면, 컨슈머는 Kafka 브로커에 자신이 처리한 마지막 오프셋 번호를 커밋합니다. 이를 통해 Kafka는 컨슈머가 어디까지 메시지를 처리했는지 기록하게 됩니다.
-
반복 처리:
- 컨슈머는 위의 과정을 반복하여 계속해서 메시지를 가져와 처리하며, 이를 통해 실시간으로 도착하는 메시지를 처리합니다.
결론 및 개발자 관점의 간편성
이 과정들은 복잡하게 보일 수 있지만, Spring Cloud Stream을 사용하면 이러한 복잡한 설정과 처리가 자동으로 관리됩니다. Spring Cloud Stream은 Kafka 설정을 매우 쉽게 만들어주며, 개발자는 인프라 관련 걱정 없이 비즈니스 로직에 집중할 수 있습니다. 다음 강의에서 이 설정들을 어떻게 사용하는지 데모를 통해 확인할 수 있습니다.
감사합니다, 다음 강의에서 뵙겠습니다.