byunyourim / TIL

오늘 공부한 CS 개념을 정리하는 공간입니다.
0 stars 0 forks source link

Kafka 기본 동작 원리 학습 #12

Open byunyourim opened 3 days ago

byunyourim commented 3 days ago

이슈: Kafka 기본 동작 원리 학습

배경

목표

세부 내용

  1. Kafka 주요 구성 요소 학습.
  2. Producer-Consumer 간 메시지 전달 흐름 파악.
  3. Kafka와 Redis ZSet 결합 가능성 검토.

진행 상황

등록일: 2024.11.19

마감일: 2024.11.25

byunyourim commented 2 days ago

Kafka 개념

분산 메시지 큐 시스템으로 대규모 데이터를 빠르게 처리할 수 있도록 도와준다.

동작 방식 및 특징

Pub-Sub 모델의 메시지 큐 형태로 동작한다.

image

메시지 큐?

메시지 지향 미들웨어를 구현한 시스템, 프로세스 간 데이터를 교환할 때 사용하는 기술이다.

메시지 큐의 장점?

. 비동기: queue라는 임시 저장소가 있기 때문에 나중에 처리 가능

  1. 낮은 결합도: 애플리케이션과 분리
  2. 확장성: producer or consumer 서비스를 원하는대로 확장할 수 있음
  3. 탄력성: consumer 서비스가 다운되더라도 애플리케이션이 중단되는 것은 아니며 메시지는 지속하여 MQ에 남아있다.
  4. 보장성: MQ에 들어간다면 결국 모든 메시지가 consumer 서비스에게 전달된다는 보장을 제공한다.

메세지 브로커 / 이벤트 브로커

메세지 브로커 publisher가 생산한 메세지를 메세지 큐에 저장하고, 저장된 데이터를 consumer가 가져갈 수 있도록 중간 다리 역할을 해주는 브로커(broker)

서로 다른 시스템(혹은 소프트웨어) 사이에서 데이터를 비동기 형태로 처리하기 위해 사용한다. (대규모 엔터프라이즈 환경의 미들웨어로서의 기능)

이러한 구조를 보통 pub/sub 구조라고 하며 대표적으로는 Redis, RabbitMQ 소프트웨어가 있고, GCP의 pubsub, AWS의 SQS 같은 서비스가 있다.

이와 같은 메세지 브로커들은 consumer가 큐에서 데이터를 가져가게 되면 즉시 혹은 짧은 시간 내에 큐에서 데이터가 삭제되는 특징들이 있다.

이벤트 브로커 이벤트 브로커 또한 기본적으로 메세지 브로커의 큐 기능들을 가지고 있어 메세지 브로커의 역할도 할 수 있다.

메세지 브로커와의 가장 큰 차이점은,

이벤트 브로커는 publisher가 생산한 이벤트를 이벤트 처리 후에 바로 삭제하지 않고 저장하여, 이벤트 시점이 저장되어 있어서 consumer가 특정 시점부터 이벤트를 다시 consume 할 수 있는 장점이 있다. (예를 들어 장애가 일어난 시점부터 그 이후의 이벤트를 다시 처리할 수 있음)

또한 대용량 처리에 있어서는 메세지 브로커보다는 더 많은 양의 데이터를 처리할 수 있는 능력이 있다.

이벤트 브로커에는 Kafka, AWS의 kinesis 같은 서비스가 있다.

일반적인 형태의 네트워크

image

그림과 같이 각 객체가 직접 연결하여 통신한다. 전송 속도가 빠르고 전송 결과를 빠르게 알 수 있지만, 중간 단계가 없어 문제가 발생하면 시스템 전체가 영향을 받을 수 있다. 한 부분에서 장애가 발생 시 전체 시스템에 영향을 미칠 수 있고, 참여하는 개체가 많아질 수록 시스템이 복잡해진다.

이를 극복하자고 나온 게 아래 모델이다.

Pub/Sub 모델

image

비동기 메세징 전송 방식으이다. 발행자(Publisher)는 메시지를 보내는 역할을 하며, 특정 주제(Topic)에 메시지를 게시한다. 구독자(Subscriber)는 관심 있는 주제를 구독하여, 해당 주제에 게시된 메시지를 수신한다.

발행자와 구독자가 서로 직접 연결되지 않고, 중간 채널을 통해 메시지를 전달한다. 이를 통해 구독자는 발행자가 누구인지 알 필요 없이 원하는 메시지만 받을 수 있다.

대표적으로 Kafka, Redis, RabbitMQ 등이 존재한다.

카프카의동작 방식

동작원리

Producer는 메시지를 생성하고 토픽에 전송한다. 브로커의 특정 파티션에 저장되며 파티션은 클러스터 내의 여러 브로커에 분산되어 저장된다. Kafka 브로커는 메시지를 저장하고, 이를 Consumer가 읽을 수 있도록 준비합니다.

Consumer는 자신이 구독한 토픽의 메시지를 읽는다. 특정 파티션에서 메시지를 읽고 처리하ㅏㄴ다ㅏ. 각 컨슈먼는 메시지를 읽은 후 offset를 관리하는데, 이는 각 컨슈머가 읽은 마지막 메시지의 위치를 추적해, 이후 읽을 메시지를 결정한다. 메시지를 처리한 후, 컨슈머는 계속해서 메시지를 읽어나간다.

Kafka는 파티션을 이용해 데이터를 분산 저장하는데, 각 파티션은 하나의 리더와 여러 개의 팔로워를 가질 수 있다.

파티션 내에서 메시지는 순차적으로 저장되고, 리더 파티션은 데이터를 읽고 쓰는 역할을 하며, 팔로워 파티션은 리더의 데이터를 복제하여 장애가 발생할 경우 데이터를 손실 없이 처리할 수 있도록 한다. 리더는 모든 쓰기 작업을 담당하며, 팔로워는 읽기 작업을 한다. 팔로워는 리더의 데이터를 복제하여 데이터의 내구성을 보장한다.

여러 개의 컨슈머가 하나의 컨슈머 그룹에 묶일 수 있으며, 각 그룹 내의 컨슈며는 서로 다른 파티션을 읽는다. 컨슈머 그룹을 사용하면 각 메시지가 한 번만 처리되도록 보장할 수 있다.

장단점

대규모 트래픽 처리 및 분산 처리에 효과적 클러스터 구성, Fail-over, Replication 같은 기능이 있음 100Kb/sec 정도의 속도 (다른 메세지 큐 보다 빠름) 디스크에 메세지를 특정 보관 주기동안 저장하여 데이터의 영속성이 보장되고 유실 위험이 적다. 또한 Consumer 장애 시 재처리가 가능하다.

byunyourim commented 2 days ago

Kafka Producer 및 Consumer 구현

byunyourim commented 2 days ago

티켓팅 대기열 로직 설계

요구 사항

구성요소

대기열 처리 흐름

  1. 사용자 요청

    • 사용자가 티켓팅 페이지에 접속하면, 사용자 요청을 받아 대기열에 순차적으로 추가한다.
    • 사용자에게 대기 중임을 알리고, 순번을 Redis의 ZSet에 추가합니다. 순번은 사용자 요청이 들어오는 순서대로 관리된다.
  2. 대기열 관리

    • Kafka의 Producer는 각 사용자의 요청을 대기열에 넣음
    • Kafka Consumer는 대기열에 있는 요청을 하나씩 처리한다.
  3. 실시간 상태 업데이트 Redis를 통해 사용자 상태를 업데이트하고, 해당 정보를 WebSocket/SSE를 통해 사용자에게 실시간으로 전달한다.

byunyourim commented 2 days ago

실시간 대기 상태 알림 구현

byunyourim commented 2 days ago

테스트 및 성능 최적화