# Kafka ## 기본 구조 {{ https://i.imgur.com/ZAOMlNu.jpg }} {{ https://i.imgur.com/EjjlPMd.jpg }} - [[프로듀서]]/[[컨슈머]] 분리 - 메시지 데이터를 여러 컨슈머에게 허용 - 높은 처리량을 위한 메시지 최적화 - 스케일 아웃 가능 - 관련 생태계 제공 ### 토픽과 파티션 - 토픽은 메시지를 구분하는 단위: 파일시스템의 폴더와 유사 - 한 개의 토픽은 한 개 이상의 파티션으로 구성 - 파티션은 메시지를 저장하는 물리적인 파일 ### 파티션과 오프셋, 메시지 순서 - 파티션은 추가만 가능한(append-only) 파일 - 각 메시지 저장 위치를 오프셋offset이라고 함 - 프로듀서가 넣은 메시지는 파티션의 맨 뒤에 추가 - 컨슈머는 오프셋 기준으로 메시지를 순서대로 읽음 - 메시지는 삭제되지 않음(설정에 따라 일정 시간이 지난 뒤 삭제) ### 여러 파티션과 프로듀서 - 프로듀서는 라운드로빈 또는 키로 파티션 선택 - 같은 키를 갖는 메시지는 같은 파티션에 저장 -> 같은 키는 순서 유지 ### 여러 파티션과 컨슈머 - 컨슈머는 컨슈머그룹에 속함 - 한 개 파티션은 컨슈머그룹의 한 개 컨슈머만 연결 가능 - 즉 컨슈머그룹에 속한 컨슈머들은 한 파티션을 공유할 수 없음 - 한 컨슈머그룹 기준으로 파티션의 메시지는 순서대로 처리 ### 성능 - 파티션 파일은 OS 페이지캐시 사용 - 파티션에 대한 파일 IO를 메모리에서 처리 - 서버에서 페이지캐시를 카프카만 사용해야 성능에 유리 - Zero Copy - 디스크 버퍼에서 네트워크 버퍼로 직접 데이터 복사 - 컨슈머 추적을 위해 브로커가 하는 일이 비교적 단순 - 메시지 필터, 메시지 재전송과 같은 일은 브로커가 하지 않음 - 프로듀서, 컨슈머가 직접 해야 함 - 브로커는 컨슈머와 파티션 간 매핑 관리 - 묶어서 보내기, 묶어서 받기 (batch) - 프로듀서 : 일정 크기만큼 메시지를 모아서 전송 가능 - 컨슈머 : 최소 크기만큼 메시지를 모아서 조회 가능 - 낱개 처리보다 처리량 증가 ### 카프카와 성능 - 처리량 증대(확장)가 쉬움 - 1개 장비의 용량 한계 -> 브로커 추가, 파티션 추가 - 컨슈머가 느림 -> 컨슈머 추가 (+파티션 추가) ### 리플리카 - 복제 - 리플리카 : 파티션의 복제본 - 복제수(replication factor) 만큼 파티션의 복제본이 각 브로커에 생김 - 리더와 팔로워로 구성 - 프로듀서와 컨슈머는 리더를 통해서만 메시지 처리 - 팔로워는 리더로부터 복제 - 장애 대응 - 리더가 속한 브로커 장애시 다른 팔로워가 리더가 됨 ## Consumer Group [[Consumer]]들의 집합, 여러개의 Partition으로 이루어진 토픽을 Partition 별로 할당받아 메시지를 처리 메시지는 Consumer Group 내에서는 단 한번 처리된다. ## Rebalance Consumer Group에 Consumer가 추가, 삭제되면 담당 Partition을 재조정 Reassign 하는 작업 이 작업이 일어나면 전체 Consumer가 메시지 수신이 순간 중단 되는 현상 발생 ## Kafka broker - 실행된 카프카 애플리케이션 서버 중 1대 - 3대 이상의 브로커로 클러스터 구성 - 주키퍼와 연동 (~2.5.0버젼) - 주키퍼의 역할 : 메타데이터(브로커id, 컨트롤러id 등) 저장 - n개 브로커 중 1대는 컨트롤러(Controller) 기능 수행 - 컨트롤러 : 각 브로커에게 담당파티션 할당 수행. 브로커 정상 동작 모니터링 관리. 누가 컨트롤러 인지는 주키퍼에 저장. {{ https://i.imgur.com/zAaFeTc.jpg }} ## Producer & Consumer 1. 프로튜서는 레코드를 생성하여 브로커로 전송 2. 전송된 레코드는 파티션에 신규 오프셋과 함께 기록됨 3. 컨슈머는 브로커로 부터 레코드를 요청하여 가져감(polling) ## Docs - [[Event Driven]] ## Links - https://blog.voidmainvoid.net/ ## 출처 - https://www.youtube.com/watch?v=VJKZvOASvUA