SPRING BATCH 와 kafka (2)

ksngh·2024년 10월 18일
0

wordme

목록 보기
2/2

스프링 배치와 카프카를 이용한 영어 문제 생성 및 발송 시스템

  • 요구사항
- 매 달 특정 카테고리별로 daily 영어 단어 및 관련 문제 생성 및 저장
- 사용자가 문제를 풀 수 있는 기능을 웹에서 제공
- 매 일 일정시간에 문제 풀 수 있는 웹 URL을 메일로 발송

Spring Batch와 Kafka를 결합하여 문제 생성 및 이메일 발송을 처리하고, 사용자가 문제를 풀고 답을 체크할 수 있도록 구현하고자 했다. 이번 글에서는 카프카를 중점으로 작성하게 되었다.

Apache Kafka

Apache Kafka는 대규모 실시간 데이터를 전송하고 처리하는 데 사용되는 분산 메시징 시스템이다. LinkedIn에서 처음 개발되었고, 이후 Apache Software Foundation에서 관리하는 오픈 소스 프로젝트로 발전했다. Kafka는 높은 처리량과 안정성, 확장성을 제공하며, 다양한 산업에서 실시간 로그 분석, 이벤트 스트리밍, 데이터 파이프라인 등 여러 용도로 사용된다.

Kafka의 기본 개념

Kafka는 주로 발행-구독(Pub/Sub) 모델을 기반으로 동작하는 메시지 브로커이다. 데이터를 생성하는 쪽인 Producer와 데이터를 소비하는 쪽인 Consumer 간의 메시지를 안전하게 중간에서 관리하는 역할을 한다. Kafka는 다음과 같은 주요 개념들로 구성된다.

토픽(Topic)

  • 토픽은 메시지를 구분하는 카테고리라고 생각할 수 있다. Kafka는 데이터를 토픽 단위로 관리하며, 각 토픽에는 고유한 이름이 부여된다.
  • Producer는 특정 토픽에 데이터를 기록하고, Consumer는 해당 토픽을 구독하여 데이터를 읽어간다.
  • Kafka에서 토픽은 파티션(partition)으로 분할되며, 이를 통해 데이터의 병렬 처리가 가능해진다.

파티션(Partition)

  • 파티션은 토픽을 분할한 논리적 단위이다. 하나의 토픽은 여러 파티션으로 나뉠 수 있으며, 각 파티션은 독립적으로 데이터를 저장하고 처리할 수 있다.
  • 파티션을 통해 병렬 처리가 가능하며, 데이터가 여러 서버에 분산 저장되므로 확장성이 높아진다.

처음에 배치에서의 파티셔닝과 카프카에서의 파티셔닝이 헷갈렸는데, 우선 상위 개념에서 파티셔닝을 하고 파티션을 통해 병렬처리가 가능해진다는 점에서는 비슷한 기능을 제공하는 것 같다. 하지만, kafka는 물리적으로 파티셔닝을 하고, batch는 논리적으로 파티셔닝을 한다는 차이가 있다.

오프셋(Offset)

  • 오프셋은 Kafka에서 각 파티션에 저장된 메시지의 고유한 순서 번호를 의미한다.
  • Consumer는 각 파티션에서 데이터를 읽을 때 해당 메시지의 오프셋을 기준으로 데이터를 추적하고 처리한다. Kafka는 오프셋을 통해 메시지의 중복 처리나 손실을 방지할 수 있다.

Producer

  • Producer는 Kafka로 데이터를 전송하는 역할을 한다. Producer는 특정 토픽에 데이터를 발행하며, 데이터를 발행하는 순간 Kafka는 이를 해당 토픽의 파티션에 저장한다.
  • Producer는 데이터를 특정 파티션에 분배하는 전략을 직접 설정할 수 있으며, 이를 통해 부하를 균등하게 나누거나 특정 파티션에 데이터를 집중시킬 수 있다.

Consumer

  • Consumer는 Kafka에서 데이터를 구독하여 읽어가는 역할을 한다. Consumer는 하나 이상의 토픽을 구독할 수 있으며, 각 파티션의 오프셋을 기준으로 데이터를 읽어간다.
  • Consumer는 보통 Consumer Group으로 묶여 있으며, 각 Consumer는 하나의 그룹 내에서 파티션을 독립적으로 처리한다. 이 방식으로 여러 Consumer가 동시에 데이터를 병렬로 처리할 수 있다.

Broker

  • Broker는 Kafka 클러스터 내에서 동작하는 서버 역할을 한다. Broker는 토픽과 파티션을 관리하며, 데이터를 저장하고 처리힌다.
  • 하나의 Kafka 클러스터는 여러 Broker로 구성될 수 있으며, 이를 통해 수평적 확장이 가능하다.
  • 각 Broker는 데이터를 저장하고, 데이터를 복제하여 장애 발생 시에도 데이터를 안전하게 보관할 수 있다.

Zookeeper

  • Kafka는 Zookeeper를 통해 클러스터의 메타데이터와 상태를 관리한다. Zookeeper는 Broker 간의 조정을 담당하고, 새로운 Broker가 추가되거나 기존 Broker가 제거될 때 이를 클러스터에 반영한다.

Kafka의 주요 기능

내결함성(Fault Tolerance)

  • Kafka는 데이터를 안전하게 저장하기 위해 복제 기능을 제공합니다. 각 파티션은 여러 Broker에 복제되며, 하나의 Broker가 실패해도 다른 Broker가 데이터를 유지하고 복구할 수 있다.
  • 복제된 파티션 중 하나가 리더(Leader) 역할을 하며, 나머지 파티션은 팔로워(Follower)로 동작하여 리더의 데이터를 복사한다. 만약 리더가 실패하면 팔로워 중 하나가 리더로 승격된다.

내구성(Durability)

  • Kafka는 로그 기반 저장소로, 모든 메시지를 디스크에 저장하며, 설정에 따라 메시지를 일정 기간 보관할 수 있다. 이로 인해, Consumer가 메시지를 처리하지 못하더라도 데이터를 나중에 다시 처리할 수 있다.
  • 오프셋을 통해 메시지가 중복되거나 유실되지 않고 정확하게 한 번 처리되도록 보장할 수 있다.

확장성(Scalability)

  • Kafka는 새로운 Broker를 추가하여 수평적으로 쉽게 확장할 수 있다. 각 파티션은 여러 Broker에 분산되므로, 클러스터가 커질수록 성능과 처리 용량이 선형적으로 증가한다.
  • Producer와 Consumer 또한 쉽게 확장 가능하며, Consumer 그룹을 추가하면 여러 Consumer가 동시에 데이터를 처리할 수 있다.

실시간 스트리밍

  • Kafka는 데이터를 실시간으로 스트리밍할 수 있으며, Producer가 전송한 데이터를 즉시 Consumer가 구독하여 처리할 수 있다.
  • 여러 Consumer가 동시에 같은 데이터를 구독하여 서로 다른 작업을 병렬로 처리할 수 있어, 다양한 애플리케이션에서 데이터를 동시에 처리할 수 있다.

Kafka의 동작 원리

Producer와 Consumer

  • Producer는 데이터를 Kafka의 특정 토픽에 발행하며, 데이터는 파티션에 저장된다.
  • Consumer는 Kafka에서 특정 토픽을 구독하여 데이터를 읽습니다. Consumer 그룹이 존재하면 각 Consumer는 서로 다른 파티션의 데이터를 처리하게 된다.

메시지 저장 및 복제

  • 각 메시지는 파티션에 저장되며, 리더 파티션이 데이터를 관리한다. 리더 파티션의 데이터는 여러 팔로워 파티션에 복제되어 장애 발생 시 데이터를 복구한다.

메시지 처리

  • Consumer는 메시지를 구독하며, Kafka는 각 Consumer가 처리해야 할 파티션을 할당한다. Consumer는 오프셋을 기준으로 데이터를 읽어가며, 처리된 오프셋을 커밋하여 메시지의 중복 처리를 방지한다.

Kafka의 활용 사례

실시간 로그 수집

  • Kafka는 대규모 시스템의 로그 데이터를 실시간으로 수집하고 분석하는 데 사용됩니다. 각 서버에서 발생한 로그 데이터를 Kafka에 전송하여 실시간으로 분석할 수 있다.

데이터 파이프라인

  • Kafka는 여러 데이터 소스로부터 데이터를 수집하여, 이를 실시간으로 분석하거나 저장하는 데이터 파이프라인을 구축하는 데 사용된다. Kafka Streams와 같은 추가 도구를 사용하여 실시간 데이터 처리가 가능하다.

메시지 큐

  • Kafka는 메시지를 전송하고 처리하는 메시지 큐로 사용할 수 있다. 여러 Consumer가 동시에 데이터를 구독하고, 각 파티션에서 데이터를 처리할 수 있어 효율적인 비동기 작업 처리가 가능하다.

kafka는 기능이 매우 다양하다. 우리 프로젝트에서는 다음과 같은 방식으로 kafka를 사용하고자 한다.

Producer - 문제 URL 전송

  • Spring Batch에서 매일 새벽 문제 생성 작업이 실행
  • 생성된 문제는 각 사용자가 풀 수 있는 문제 URL로 변환되어 Kafka의 특정 토픽(Topic)에 메시지로 전송
  • Kafka의 Producer는 문제 URL을 발행하는 역할을 하며, 이 URL을 Kafka 토픽에 기록
  • 각 문제 URL은 사용자 그룹에 맞춰 발송되며, Kafka의 파티셔닝을 통해 여러 파티션에 나누어 저장될 수 있다.

Kafka 토픽과 파티셔닝

  • Kafka 토픽(Topic): 각 문제 URL은 Kafka의 특정 토픽에 저장된다. 예를 들어, vocabulary-category-*와 같은 토픽에 저장되며, 이는 각 사용자 그룹 또는 카테고리별로 구분됩니다.
  • 파티셔닝(Partitioning): Kafka 토픽은 여러 파티션으로 나누어질 수 있다. 각 파티션은 독립적으로 처리되며, 여러 Consumer가 병렬로 처리할 수 있는 구조를 제공합한니다. 이를 통해 수천 명의 사용자에게 동시에 문제를 발송할 수 있다.

Consumer - 이메일 발송 작업

  • Kafka Consumer는 Kafka에서 전달된 문제 URL을 구독하고, 이를 기반으로 이메일 발송 작업을 수행한다.
  • 각 Consumer는 Kafka에서 파티션으로 나뉜 데이터를 병렬로 처리하며, 이메일 발송 작업을 효율적으로 처리할 수 있다.
  • Consumer는 이메일 발송 작업이 성공적으로 완료되면, 해당 메시지를 처리 완료로 표시하고, 문제가 있을 경우 재시도할 수 있도록 Kafka의 메시지 상태를 관리한다.

이메일 발송 실패 시 처리

  • 만약 이메일 발송 과정에서 오류가 발생할 경우, Kafka는 해당 메시지를 다시 처리하도록 메시지 유실을 방지한다.
  • Kafka는 오프셋(Offset)을 통해 각 메시지의 처리 상태를 추적하며, 처리되지 않은 메시지는 재처리하거나 특정 시간 이후에 다시 발송할 수 있다.

Kafka를 통한 작업 흐름 요약

  1. Spring Batch가 매일 새벽 영어 문제를 생성하여 데이터베이스에 저장한다.
  2. 생성된 문제는 Kafka Producer를 통해 문제 URL로 변환되어 Kafka 토픽에 메시지로 전송된다.
  3. Kafka Consumer는 이 메시지를 구독하여, 각 사용자에게 문제 URL을 포함한 이메일 발송 작업을 수행한다.
  4. 발송 실패 시, Kafka는 메시지를 다시 처리하여 메시지 유실을 방지하고 안전하게 이메일이 발송되도록 한다.
profile
백엔드 개발자입니다.

0개의 댓글

관련 채용 정보