카프카 kafka 정리 2
도서 정리 - 아파치 카프카 애플리케이션 프로그래밍 with 자바 (최원영)
카프카 토픽
토픽은 관계형DB에서 테이블과 같으며 토픽 안에는 파티션이 있다
프로듀서 -> 파티션에 적재 -> 컨슈머
모든 파티션에 적재되는 것이 아닌 하나의 파티션에 적재된다
queue 자료구조
파티션에 들어있는 데이터를 순차적으로 소비한다
파티션에 있는 데이터는 삭제되지 않는다 -> 한 번 더 가져갈 수 있다
가져간 offset이 커밋(기록)된다
카프카 특징
높은 데이터 처리량
데이터를 묶어서 송수신하여 네트워크 통신횟수를 최소화
파티션에 나눠 병렬처리
컨슈머도 파티션 개수만큼 늘려 처리량 높인다
직렬화, 역직렬화로 데이터 타입이 상관 없다
확장성
브로커 늘려서 scale out
영속성
처리지점을 알면 재처리 가능
파일시스템에 저장함으로써 장애발생해도 서버 재가동으로 복구
페이지 캐시 메모리에 저장함으로써 속도 개선
고가용성
프로듀서로 전송받은 데이터는 여러 브로커에 동시 저장(replication)하기 때문에 서버 장애가 발생되어도 처리가 가능하다
3대부터 데이터 유실, 지연 없는 완전 복제가 가능하다
카프카 프로듀서와 컨슈머
프로듀서 -> 카프카 클러스터(적절한 토픽) -> 컨슈머
프로듀서
프로듀서 API는 카프카의 시작점
send는 비동기 응답
메세지 키를 보낼 수도 있고, 커스텀 파티셔너를 생성할 수도 있다
파티션 지정 가능
직렬화를 통해 바이너리 데이터(동영상)도 전송 가능
컨슈머
컨슈머 그룹을 기준으로 오프셋을 관리함
poll로 데이터를 가져온다
while(true)와 같은 반복문을 통해 지속적인 데이터 처리를 한다
poll하고 commitSync를 통해 수동 오프셋 커밋을 하면 데이터 유실 및 중복을 엄격하게 관리 가능
commitAsync 덜 엄격한 커밋
리밸런싱
컨슈머가 추가 또는 제거될 때 파티션을 컨슈멍에 재할당하는 것
shutdown hook -> WakeUpException -> 종료처리
카프카 스트림즈
토픽 -> 스트림즈(stateless) -> 토픽
스트림즈 DSL과 프로세서 API 제공
스트림즈 DSL은 많은 기능을 가진 인터페이스를 제공
태스크(Task)
데이터 처리 최소단위
소스(root) 프로세서 -> 스트림 프로세서(처리) -> 싱크 프로세서
Kstream 키 값 형태, Ktable 유니크한 키 기준으로 데이터 처리(최신 데이터)
StreamsBuilder.stream()에서 스트림 정의
StreamsBuilder.filter()
StreamsBuilder.join()
StreamsBuilder.to() - sync 프로세서로 보낸다
KafkaStreams.start()
스트림 빌더에서 정의한 스트림을 실행
프로듀서
Properties에 각 프로세서 지정
Topology.addSource().addProcessor().addSink()
카프카 커넥트; 특정 작업을 템플릿화한 것
프로듀서
소스 커넥터; 데이터 전송
SourceConnector
설정 정의
SourceTask
데이터를 토픽으로 전송
컨슈머
싱크 커넥터; 데이터 처리
메서드 재정의하여 사용
컨버터 생성하여 사용 가능
단일모드 커넥트, 분산모드 커넥트(2대 이상)
파티션
토픽 안의 파티션 개수를 줄이는 것은 지원하지 않는다
파티션 수를 줄이려면 토픽을 삭제해야한다
파티션 수는 첫 번째로는 프로듀서의 송신량을 고려하고
두 번째로는 컨슈머의 수신량을 고려해야한다
보통 컨슈머 처리량에 따라 파티션 개수를 맞춘다
파티션은 카프카 병렬처리의 핵심이다
컨슈머 처리량을 늘리거나 컨슈머를 추가하여 병렬처리량을 늘려 데이터 처리의 속도를 개선한다
(메세지 키를 사용하는 컨슈머의 경우 파티션의 개수가 달라질 경우 특정 메세지 키의 파티션의 순서를 보장받지 못하는 문제가 있을 수 있다)
컨슈머 랙Lag
토픽의 최신 오프셋과 컨슈머 오프셋의 차이
일시적으로 파티션과 컨슈머를 늘리는 방법도 있다
컨슈머 랙 모니터링 툴; 카프카 버로우
프로듀서 설정/옵션
프로듀서 acks
1은 리더 파티션에만 저장
all or -1은 전부 저장
멱등성 프로듀서; 한 번만 저장
enable.idempotence true
트랜잭션 transactional.id를 설정하면
프로듀서와 컨슈머는 트랜잭션 레코드가 존재하는 데이터만 처리한다
멀티스레드 컨슈머카프카 미러메이커
댓글을 작성해보세요.