고성능 준 실시간 메시징 미들웨어인 카프카에 대해 간략하게 알아보자
- 목적
- 프로듀서와 컨슈머의 분리
- 영구 메시지 데이터를 여러 컨슈머에게 허용
- 전사 데이터의 중앙 집중화
- 장점
- 높은 처리량
- 스케일 아웃의 용이함
- 단점
- 직접 통신을 하지 않기 때문에 메시지의 정확한 전달 여부 확인이 어렵다 → 적어도 한번 전달은 가능
- 특징
- 메시지 교환 전달 신뢰성 관리를 프로듀서와 컨슈머로 이동시킴 → 브로커의 고성능이 가능해짐
- 교환기(exchange)의 기능을 컨슈머로 이동시킴 → 컨슈머가 직접 자신의 큐에 접속하여 처리
-
주키퍼
- 분산 어플리케이션을 위한 코디네이션 시스템
- 코디네이션: 분산된 각 어플리케이션의 정보를 중앙 집중화하고 구성, 그룹 관리, 동기화 서비스를 제공
- 카프카는 코디네이션을 위한 주키퍼를 이용함
- 지노드
- 데이터를 저장하기 위한 공간
- 과반수 방식을 따르며 과반수 이상이 살아있다면 안정적이 서비스가 가능
- 이를 위해 홀수 구성이 필수
- controller 노드: 카프카 클러스터의 리더 선출 작업을 위해 쓰임. 브로커 중에 하나를 선정함
- broker 노드: 모든 브로커 관련 정보가 저장됨
- consumer 노드: 모든 컨슈머 관련 정보가 저장됨
- 저자는 세션 타임아웃은 3초 이상을 권장한다
- 추후 4.0 버전에서 제거되었음
-
특징
- 페이지 캐시 사용
- OS는 잔여 메모리를 페이지 캐시로 유지하여 OS 성능 향상을 유도
- 카프카에서는 이 페이지 캐시를 이용하여 성능을 향상 시킴
- 이 때문에 물리 머신에서 다른 어플리케이션을 같이 운영하는 것을 권장하지 않음
- 배치 전송 처리
- 네트워크 I/O 오버헤드를 줄이기 위해 메시지를 묶음으로 처리하여 전송
-
데이터 모델
- 토픽
- 파티션
- 토픽의 데이터 저장소를 수평으로 확장하기 위한 개념
- 토픽을 병렬 처리 할 수 있도록 분할
- 카프카에서 파티션 수를 늘릴 수는 있으나 줄일 수는 없음 ( 최대: 2000 )
- 카프카의 리플리케이션은 토픽이 아닌 파티션을 리플리케이션 하도록 동작
- 오프셋
- 파티션마다 메시지가 저장되는 위치
- 순차적으로 증가되는 64비트 정수 ( Long 형 )
- 메시지의 순서를 보장하기 위함
- 리더와 팔로워
- 리더: 읽기와 쓰기가 일어나는 브로커
- 팔로워: 리더의 데이터를 그대로 리플리케이션하는 브로커
- ISR ( in sync replica )
- 팔로워의 데이터가 리더와 정합성이 맞지 않는 경우 불일치를 해결하기 위한 방법
- 리플리케이션 그룹을 통칭하는 단어
- 위 기능을 지원하기 위해 재 시작 시 마지막 리더가 반드시 재 시작 되어야 한다
-
프로듀서
- 카프카에서 메시지를 생산해 내는 주체
- Java에서는 Send 함수로 전송하며 Future 객체를 리턴한다
- 주요 설정 옵션
- bootStrap.servers: 카프카 클러스터의 정보. 모든 브로커 리스트를 입력해야 한다
- acks
- 요청을 완료하기 전 메시지 송신의 신뢰성 레벨
- level 0: 신뢰할 수 없음. 매우 높은 처리량
- level 1: 리더의 데이터만 확인함. 일반적인 경우 사용
- level all: 모든 isr의 팔로워를 체크함
- 프로듀서의 level 설정보다 서버의 level이 더 낮다면 설정은 서버를 따른다
-
컨슈머
- 토픽의 메시지를 가져와 소비하는 주체
- 특정 파티션을 관리하는 파티션 리더에게서 메시지를 가져옴
- 주요 옵션
- group.id: 컨슈머가 속한 컨슈머 그룹을 식별하는 식별자
- max.poll.records: 단일 poll 호출에 대한 최대 레코드 수
- 컨슈머의 출력 순서는 각 토픽 파티션의 오프셋 순서이다
- 전체 메시지의 순서를 보장해야 하는 경우 파티션 수가 1이어야 한다
- 컨슈머 그룹
- 하나의 토픽에 여러 컨슈머 그룹이 접속하여 데이터를 가져가기 위함
- 파티션에 해당하는 컨슈머가 지정되는 행위를 리밸런스라고 한다
- 컨슈머 그룹 중 첫 번째로 등록된 컨슈머가 컨슈머 리더로써 리밸런스를 담당한다
- 토픽의 파티션에는 하나의 컨슈머만 연결이 가능하다
- 커밋과 오프셋
- 컨슈머는 각각 파티션에서 자신이 가져간 **메시지의 위치 정보(오프셋)**을 기록한다
- 파티션에 대해 현재까지 읽었던 위치를 업데이트하는 동작을 커밋이라고 한다
- 카프카에서는 적어도 한번 전달은 가능하지만 중복은 존재 할 수 있다
-
데이터 파이프 라인
- Data가 각 지점을 순조롭게 흐르도록(flow) 만드는 과정.
- Data의 추출(extracting), 변경(transforming), 결합(combining), 검증(validating) 그리고 적재(loading)하는 과정들을 자동화 하는 것이다.
-
카프카 스트림즈