
Kafka
실시간 데이터 스트리밍 처리를 위한 분산 데이터 스트리밍 도구
왜 사용하는가?
트래픽이 엄청나게 많이 발생 하는 경우 (한정 상품 재입고, 대규모 참여 타임세일 등) DB나 Redis는 동시에 그렇게 많은 요청을 처리할 수가 없음
그래서 Kafka 에 담아 두었다가 작업을 천천히 처리할 수 있게 해줌
그 작업 처리 방식엔 2가지 처리 방안이 있음
비동기 처리
Kafka 가 이벤트를 저장하고 있기 때문에 DBMS 관련이 느리더라도 천천히 재처리 가능
파티션 기반의 병렬 처리
Kafka 는 Partition 이라는 병렬 처리 단위를 제공함
Kafka 는 메세지를 파티션 단위로 나뉘어 저장 하고 Consumer 가 병렬로 처리할 수 있도록 함
즉, Kafka 는 메세지를 안전하게 저장하여 Consumer 들이 Partition 단위로 빠르게 처리하게 해줌
→ 대규모 서비스를 운영하기 위한 기술
Kafka의 활용 방안
실시간 인기 카테고리
사용자의 클릭/조회 이벤트를 Kafka 에 저장
Consumer 가 Kafka 이벤트를 읽어 Redis의 Score 를 업데이트
인기 순위는 Redis 를 통한 즉시 조회
개인화 기능
사용자가 어떤 카테고리를 많이 조회하는지 Kafka 에 저장
Kafka → Redis 에 사용자별 점수 반영
추천 API를 통해 사용자 맞춤 카테고리 제공
Kafka 의 대략적인 구조
Producer, Consumer, Topic, Partition, Consumer Group, Offset
Producer
Kafka 로 메세지를 보내는 역할
보통 API 서버가 Producer 역할을 함
이벤트를 생성하고 Topic 이라는 영역으로 전달
Consumer
Kafka 에 쌓인 이벤트를 하나씩 읽어 처리하는 처리자
Consumer Group
여러 Consumer를 팀으로 묶어 나눈 것
1개의 Partition 은 오직 1개의 Consumer 만 처리할 수 있음
Consumer Group 은 팀에 소속된 Consumer 가 어떤 파티션을 담당할지 지정해줌
Topic
Kafka 에서 같은 종류의 메세지별 분리 단위
주문 확정의 이벤트들의 모임
예매 시도의 이벤트들의 모임
Partition
Topic 을 여러 칸으로 나눈 것
메세지 처리를 동시에 할 수 있게 하기 위함
Partition 수와 Consumer 수는 동일한 것이 이상적
늘린 Partition 은 다시 줄일 수 없음
Offset
메세지의 번호
어디까지 읽었는가를 기록
서버가 재시작 해도 이어서 읽을 수 있음
위 사진에서 1번 처리를 하면 Offset 1번을 기록 해두고 2번 이벤트의 처리를 요구 그러다가 더 이상 Offset 없으면 Consumer 는 다음 Offset 이 생성 될 때까지 대기
그외 특징
Kafka 는 실시간 처리를 하는 것은 아니다
이벤트를 저장해 두었다가 순서대로 처리할 수 있게 해주는 도구
DB가 아니다
저장과 재처리, 처리의 순서를 보장해주도록 도와주는 도구
병렬처리는 Partition 의 수에 결정되지 Consumer 의 수에 결정되는 것이 아니다
Partition 보다 Consumer 의 수가 많으면 남은 Consumer 는 대기 상태에 머무름