728x90
kafka란?
- Apache Kafka
- 고성능 분산 이벤트 스트리밍 플랫폼
kafka 기본 구조
- 카프카 클러스터
- 메시지(이벤트)가 저장되는 곳
- 데이터가 이동하는데 필요한 핵심 역할을 수행한다
- 여러 개의 브로커로 구성된다
- 브로커는 일종의 서버로 생각하면 된다
- 브로커가 메시지를 나눠서 저장하고, 이중화 처리, 장애 시 대체 등 다양한 역할을 한다
- 주키퍼 클러스터
- 카프카 클러스터 관련 정보가 기록된다
- 이를 통해 카프카 클러스터가 관리된다
Topic & Partition
- 토픽
- 메시지를 구분하는 단위
- 파일시스템의 폴더와 유사하다
- 한 개의 토픽은 한 개 이상의 파티션으로 구성된다
- 파티션
- 메시지를 저장하는 물리적인 파일
- 프로듀서는 메시지를 카프카에 저장할 때 어떤 토픽에 저장해야하는지 요청하고, 컨슈머는 어떤 토픽에서 메시지를 읽어올 지 결정한다
- 즉, 프로듀서와 컨슈머는 토픽을 기준으로 메세지를 주고 받는다
파티션, 오프셋, 메시지 순서
- 파티션은 기본적으로 추가만 가능한 append-only 파일이다
- 각 메시지 저장 위치를 offset이라고 한다
- 프로듀서가 메시지를 카프카에 저장하면 메시지들은 순서대로 오프셋 1, 오프셋 2,.. 등과 같이 오프셋 값을 갖는다
- 또한 프로듀서가 넣은 메시지는 파티션의 맨 뒤에 추가된다 (순서 보장)
- 컨슈머는 오프셋 기준으로 메시지를 순서대로 읽는다
- 메시지는 삭제되지 않는다 → 설정에 따라 일정 시간이 지난 뒤에 삭제, 컨슈머가 읽어갔는지 등은 상관 X
여러 파티션과 프로듀서
- 프로듀서는 Round Robin 또는 key를 통해서 파티션을 선택한다
- 같은 key를 갖는 메시지는 같은 파티션에 저장된다 → 같은 키에 대해서는 메시지 순서가 유지(보장)된다
- 컨슈머는 컨슈머 그룹에 속한다
- 1개의 파티션은 컨슈머 그룹 중 1개의 컨슈머만 연결이 가능하다
- 즉, 컨슈머 그룹에 속한 컨슈머들은 1개의 파티션을 공유할 수 없다!
- 1개의 컨슈머 그룹 기준으로 파티션의 메시지는 순서대로 처리된다! → 이를 통해서 파티션 별로 컨슈머그룹의 순서를 보장하는것임!!
- 토픽이 아니고 파티션임!
성능
- 카프카는 성능이 좋다고 함!
- 파티션 파일은 OS가 제공하는 페이지 캐시를 사용한다
- 파티션에 대한 파일 IO가 메모리에서 처리되어 속도가 빠르다
- 서버에서 페이지캐시를 카프카만 사용해야 성능에 유리하다
- Zero Copy를 사용한다
- 디스크 버퍼에서 네트워크 버퍼로 직접 데이터를 복사하여 속도가 빠르다
- 브로커가 컨슈머 추적을 위해 하는 일이 비교적 단순함
- 보통의 메시징 시스템은 메시지 필터, 재전송 등의 일을 한다
- 그러나 카프카는 메시지 필터, 재전송 등의 작업을 브로커가 하지 않는다 → 프로듀서/컨슈머가 직접 해야함
- 브로커는 컨슈머와 파티션 간 매핑 관리만 수행한다
- Batch 처리
-
- producer: 일정 크기만큼 메시지를 모아서 전송 가능
- consumer: 최소 크기만큼 메시지를 모아서 조회 가능
- 낱개 처리를 하는 것보다 처리량이 증가한다!
- 처리량(throughput) 증대(확장)가 쉬움
-
- 1개 장비의 용량 한계가 발생하면 브로커 및 파티션을 추가하면 된다!
- 컨슈머가 느리다 → 컨슈머 또는 파티션을 추가하면 된다!
리플리카 - 복제
- 카프카는 장애 시 대처를 위해서 리플리카를 사용한다
- 리플리카 → 파티션의 복제본
- 복제 수(replication factor)만큼 파티션의 복제본이 각 브로커에 생긴다
- 리더와 팔로워로 구성된다
- 여러 리플리카 중 1개가 리더가 되고 나머지는 모두 팔로워가 된다
- 프로듀서와 컨슈머는 리더를 통해서만 메시지를 처리한다
- 나머지 팔로워는 리더로부터 데이터를 복제한다
- 장애 대응
- 리더가 속한 브로커 장애 시 다른 팔로워가 리더가 된다
https://www.youtube.com/watch?v=0Ssx7jJJADI&t=229s
728x90
'야미스터디 > Backend' 카테고리의 다른 글
[Youtube] kafka 조금 아는 척하기 2편 - 프로듀서 (0) | 2024.09.04 |
---|---|
개발자가 알아야 할 인터페이스 개념💡 (0) | 2023.06.27 |
개발자로 성장하는 꿀팁 5가지🍯 (3) | 2022.11.07 |
[Etc] Docker 📌 (0) | 2022.10.11 |
[Etc] DTO 📌 (0) | 2022.09.28 |
댓글