아파치 주키퍼를 사용하는 이유카프카는 현재 클러스터의 멤버인 브로커들의 목록을 유지하기 위해서다.각 브로커는 브로커 설정 파일에 정의되었거나 아니면 자동으로 생성된 고유한 식별자를 가진다.브로커 프로세스는 시작될 때마다 주키퍼 Ephemeral 노드의 형태로 ID를 등록한다.컨트롤러를 포함한 카프카 브로커들과 몇몇 생태계 툴들은 브로커가 등록되는 주키퍼의 /brokers/ids 경로를 구독함으로써 브로커가 추가/제거 될 때마다 알림을 받는다.ID는 중복되지 않으며, 중복된 값이 추가된다면 동일한 브로커 ID를 갖는 ZNode가 있기 때문에 실패하며 에러가 발생한다.더보기ZNode의 종류는 영속 종류에 따라 다음과 같이 구분된다. (참조)Persistent Nodes(영구 노드) : 명시적으로 삭제되기 전..
물리적 스레드와 논리적 스레드물리적인 스레드는 병렬성과 관련이 있으며, 논리적인 스레드는 동시성과 관련이 있다. 물리적 스레드하나의 코어는 두개의 스레드를 포함하고 있는데 이 두개의 스레드는 물리적인 코어를 논리적으로 나눈 것을 의미한다.이렇게 물리적인 코어를 논리적으로 나눈 코어를 물리적인 스레드라고 한다.쉽게 하드웨어와 관련된 스레드라고 생각할 수 있다. 논리적 스레드소프트웨어적으로 생성되는 스레드를 의미하며, Java 프로그래밍에서 사용되는 스레드를 말한다.프로세스 내에서 실행되는 세부 작업 단위이론적으로는 메모리가 허용하는 범위 내에서 얼마든지 만들 수 있지만 결국 물리적인 스레드의 가용 범위 내에서 실행될 수 있다. Scheduler란?운영체제 레벨에서의 Scheduler는 실행되는 프로그램인 ..
AdminClient 개요AdminClinet.createTopics메서드는 토픽이 생성될 때 까지 기다리거나, 생성 상태를 확인하거나 토픽이 생성된 뒤 토픽 설정을 가져올 수 있다.카프카의 각 메서드 요청을 컨트롤러로 전송한 뒤 바로 1개 이상의 Future 객체를 리턴한다. 카프카 컨트롤러부터 브로커로의 메타데이터 전파는 비동기적으로 이루어지기에 AdminClient가 전달하는 Future 객체들은 컨트롤러의 상태가 완전히 업데이트 된 시점에서 완료된 것으로 간주한다. 즉, 모든 브로커가 전부 다 새로운 상태에 대해 알고 있지 못할 수 있다.토픽에 최신 상태를 전달 받지 않은 브로커에 의해 처리될 수 있다.일관성을 지키기 위해 최종적으로 모든 브로커는 모든 토픽에 대해 알게 되어 동기화 처리가 되겠지..
Sinks란?리액티브 스트림즈의 구성요소 중 하나로 Subscriber로서 기능할 땐 다른 Publisher를 구독할 수 있고, Publisher로서 기능할 땐 다른 Subscriber가 구독할 수 있습니다.Signal을 프로그래밍 방식으로 푸시할 수 있는 구조 (Flux, Mono의 의미 체계를 가진다.)명시적으로 Signal을 전송할 수 있다. 기존의 Reactor의 Processor 방식을 개선한 Sinks가 지원되면서 Reactor 3.5.0 부터 제거 되었다.onNext, onComplete, onError 메서드를 직접적으로 호출함으로써 스레드 안정성이 보장되지 않을 수 있었다.Sinks의 경우에는 동시 접근을 감지하고, 동시 접근하는 스레드 중 하나가 빠르게 실패함으로써 스레드 안전성을 보장..
컨슈머 랙(LAG)컨슈머 애플리케이션을 운영하고 전체 데이터 파이프라인을 운영할 때 가장 중요한 지표 중 하나며, 토픽의 최신 오프셋(LOG-END-OFFSET)과 컨슈머 오프셋(CURRENT-OFFSET) 간의 차이를 말합니다.컨슈머 랙 = 프로듀서 오프셋 - 컨슈머 오프셋 이런 차이가 발생하는 이유는?프로듀서는 항상 최신의 offset을 가지지만 컨슈머는 애플리케이션 상황에 따라서, 혹은 처리 방식에 따라서 데이터 처리량이 늦어질 수 있기 때문입니다.poll() 메서드 전에 데이터를 배치로 받아오기 때문에 늦어져도 처리는 가능하지만 지연이 발생한다면 파티션 개수를 늘리고 컨슈머 개수를 늘리는게 좋다. 컨슈머 랙을 보는 방법컨슈머 랙은 컨슈머 그룹과 토픽, 파티션별로 생성됩니다. 즉 각각의 컨슈머 그룹..