inblog logo
|
LifeLog, DevLog
    Kafka

    Kafka 설계 방침

    KYJTHEYJ's avatar
    KYJTHEYJ
    Apr 01, 2026
    Kafka 설계 방침
    Contents
    Topic 의 설계네이밍분리하는 경우Key 의 설계key 역할Key 가 없이 메세지를 보내는 경우Key 를 포함해서 메세지를 보내는 경우자주 사용하는 기준Key 설계 실패 시Partition 의 적절한 수고려해야하는 점들Lag

    Topic 의 설계

    네이밍

    메세지 종류를 표기하는 것이 좋음

    토픽은 어떤 종류의 이벤트의 메세지가 머무르는 곳이기 때문 → 메세지 종류라는 것은 이벤트의 종류를 의미

    네이밍의 규칙은 {도메인}-{행위} / {도메인}.{행위} 등으로 표기

    order-created
    user-signup
    stock-decresed
    payment-completed
    order-confirmed
    

    분리하는 경우

    • 완전히 다른 이벤트

      • 주문 이벤트

      • 회원 이벤트

    • 성격이 다른 이벤트

      • 상태 변경 이벤트

      • 로그/추적 관련

    • 운영 레벨이 다른 경우

      • 기간제 이벤트

      • 중요성이 높은 이벤트

    • Consumer 가 다른 경우

      • 결제 이벤트 → 정산 관련 Consumer

      • 가입 이벤트 → 회원 관련 Consumer

    • 처리 시간이 다른 경우

      • 실시간 이벤트 (주문 관련 등..)

      • 하루 한번의 이벤트 (마감 및 정산 관련 등..)

    • 메세지 크기가 다른 경우

      • 이미지가 포함되는 경우와 아닌 경우 (같은 토픽인 경우 작은 메세지가 큰 메세지에 밀림)

    • 보존 기간의 차이

    • 재처리하는 관점이 다른 경우

      • 즉시 재처리해야 하는 경우

      • 다음날 Batch 로 처리하는 경우

    설정 관련이나 Consumer 가 다른 경우나, 처리방식이 다른 경우 → 분리해야 함

    Key 의 설계

    key 역할

    • 어떤 파티션으로 메세지를 보내는지 결정

    • 같은 key를 가진 메세지에 대해 순서를 보장

    key 가 같으면 → 같은 파티션으로 이동 key 가 다르면 → 여러 파티션으로 분산

    Key 가 없이 메세지를 보내는 경우

    • 어떤 파티션에 들어가도 상관 없는 경우

    • 처리량의 극대화가 목적일 때

    로그 수집 클릭 이벤트 단순 알림 통계 데이터 관련

    Key 를 포함해서 메세지를 보내는 경우

    • 순서 보장이 필요할 때

    • 같은 대상의 이벤트를 묶을 때

    String userId = "user-1";
    String message = "유저 1의 주문 이벤트";
    
    kafkaTemplate.send("order-events", userId, message);
    
    • userId 에 대한 메세지를 같은 파티션으로 항상 전송

    • 내부에서 순서 또한 보장

    자주 사용하는 기준

    • 순서 보장이 우선이 되어야 하는 단위에 따라 key 를 사용

      • 주문의 순서 보장이 주요할 경우 → order 의 ID

      • 계좌, 잔액, 누적 상태가 주요할 경우 → account의 ID

      • 회원 단위 순서가 주요할 경우 → user 의 ID

    • 다만 성능 관리도 해야하니 부하의 분산도 고려해야함

    Key 설계 실패 시

    • 특정 key 에 메세지가 몰리니 key 가 속한 Partition 이 과도하게 바빠짐

      • 나머지 Partiton 은 쉬게 됨

      → Hot Partition 현상

    Partition 의 적절한 수

    파티션이 과도하게 많아도 운영의 비용이 늘어남

    반대로 파티션이 적으면 Consumer 의 수가 적으니 처리가 바빠짐

    고려해야하는 점들

    • Partiton 의 수 = Consumer 의 상한선

    • 초기 트래픽과 미래 트래픽 고려하기

      • 초기만 보고 Partition 을 적게 잡으면 확장시 힘들어짐

      • 과도하게 미래만 보고 Partiton 을 늘리면 운영 비용 증가

    초기엔 적당한 파티션의 수 로 시작 (3의 배수로 시작하는 것은 기본)
    트래픽이 점차 증가하면 새로운 토픽으로 점차 전환
    또는 기존 Topic 의 Partiton 늘리기 (순서 보장은 힘들 수도 있음)

    Lag

    Consumer Lag
    → Topic 에 쌓여있는 메세지 중
    Consumer Group 에서 읽지 못한 메세지 갯수를 의미

    0에 가까울 수록 적절하게 거의 실시간으로 처리 되고 있음을 의미

    점점 쌓이면 처리 속도가 느리다는 것을 의미

    • Consumer 수를 늘리거나, 처리 로직을 개선하거나, 트래픽 제어가 필요

    Share article
    Contents
    Topic 의 설계네이밍분리하는 경우Key 의 설계key 역할Key 가 없이 메세지를 보내는 경우Key 를 포함해서 메세지를 보내는 경우자주 사용하는 기준Key 설계 실패 시Partition 의 적절한 수고려해야하는 점들Lag

    LifeLog, DevLog - https://github.com/KYJTHEYJ

    RSS·Powered by Inblog