🔑 Kafka에서 메시지 순서를 보장하는 방법
2025. 9. 17. 16:29

Kafka는 여러 메시지를 비동기적으로 동시에 전송하기 때문에 처리량과 성능이 좋음

이 때, Kafka에서의 메시지 순서 보장은 전역적으로 이루어지는 것이 아니라, 파티션 단위로만 이루어짐!

반대로 말하자면, 파티션 단위 이외에는 메시지 순서를 보장하지 않음

1. 파티션 단위의 순서 보장

  • Kafka 토픽은 여러 개의 파티션으로 나눠서 저장됨
  • 같은 파티션 안에서는 Producer가 보낸 순서대로 메시지가 저장되고, Consumer도 그 순서대로 따라 읽음
  • 하나의 파티션에 들어간 메시지는 append-only(뒤에만 추가) 로그 형태로 쌓임
    메시지의 offset이 메시지 순서가 되는 것
  • 즉, 파티션 내부에서만 순서가 보장

2. 🔑 파티셔닝 전략

  • Producer가 메시지를 보낼 때, 메시지 키(Key)를 지정할 수 있음
  • 같은 키를 가진 메시지들끼리는 항상 같은 파티션으로 매핑됨
  • 따라서, 같은 키를 사용하면(예: 사용자id, 주문id) 해당 엔티티 단위로 순서를 보장할 수 있음

3. 파티션을 여러 개 사용할 때

  • Producer의 메시지 분산 방식 2가지
    • Key 기반 분산 : 같은 키는 같은 파티션으로 전송
    • 라운드 로빈 : 키가 없는 경우, 순차적으로 파티션에 균등하게 분배
  • 서로 다른 파티션에 들어간 메시지 간에는 순서를 맞춰줄 메커니즘이 없음. 전역적으로 순서 보장 안됨
  • 그러니까 특정 엔티티 단위로만 순서가 중요한 경우, 그 엔티티 ID를 메시지 키로 사용할 것. (예: 사용자, 주문 등)

4. 전역 순서가 필요한 경우

Kafka 자체로는 불가능함

1. 파티션을 1개만 사용하거나,

  • 전체 순서를 유지할 수 있으나
  • 병렬 처리가 불가능해져서 확장성이 떨어짐

2. 애플리케이션 레벨에서 재정렬하거나.

  • 각 메시지에 타임스탬프나 시퀀스 번호를 넣고, Consumer에 정렬 로직 추가
  • 이 경우, 지연과 버퍼링이 발생할 수 있음
LIST
코딩하니~
코딩하니~