아래 블로그에 대한 내용을 정리한 글입니다.https://dol9.tistory.com/281https://dol9.tistory.com/282https://www.youtube.com/watch?v=tU2pHxLh4ZU 카프카에서 Purgatory가 사용될 때컨슈머컨슈머에서 메시지를 가져올 때 성능 개선을 위해서 메시지를 배치로 묶일 때 까지 대기를 하게 된다.컨슈머가 브로커로부터 레코드를 읽어올 때 데이터의 최소량(byte 단위)이 되지 않았을 때카프카가 컨슈머에게 응답하기 전 충분한 데이터가 모일 때까지 기다릴 수 있는데 시간을 만족하지 않았을 때이 때 컨슈머가 보낸 요청이 머무는 것을 Purgatory라고 하며, Purgatory에서 벗어나는 방법은 요청 조건에 만족하거나, 지정한 시간이 흘러 t..
분류 전체보기
카프카의 ‘정확히 한 번’ 의미 구조는 멱등적 프로듀서(idempotent producer)와 트랜잭션 의미 구조의 조합으로 이루어진다.멱등적 프로듀서: 프로듀서 재시도로 인해 발생하는 중복을 방지트랜잭션 의미 구조: 스트림 처리 애플리케이션에서 ‘정확히 한 번’ 처리를 보장 멱등적 프로듀서DB에서 아래 구문은 몇 번을 호출하든 간에 x는 18이기 때문에 멱등적이라고 할 수 있다.UPDATE t SET x=18 where y=5 가장 고전적인 카프카에서 재시도로 인한 메시지 중복 예시파티션 리더가 프로듀서로부터 레코드를 받아서 팔로워들에게 성공적으로 복제했지만 프로듀서에게 응답을 보내기 전, 파티션 리더가 있는 브로커에 크래시가 발생한 경우프로듀서 입장에서는 응답을 받지 못한 채 타임아웃이 발생하고, 메..
카프카는 어떻게 신뢰성을 보장할까? 1️⃣ 카프카는 파티션 안의 메시지들 간에 순서를 보장한다.메시지 A 다음에 B가 쓰여졌다면 동일한 프로듀서가 동일한 파티션에 썻을 경우 B의 오프셋이 A보다 큰 것을 보장한다. 2️⃣ 클라이언트가 쓴 메시지는 모든 in-sync replica의 파티션에 쓰여진 뒤에야 commit된 것으로 간주한다.굳이 디스크에 flush될 필요까지는 없으며 프로듀서의 commit 정책을 지정할 수 있다. (acks)완전히 commit된 다음 응답리더에게 쓰여진 다음 응답네트워크로 전송된 다음 바로 응답 3️⃣ commit된 메시지들은 최소 1개의 작동 가능한 replica가 남아 있는 한 유실되지 않는다. 4️⃣ 컨슈머는 commit된 메시지만 읽을 수 있다.메시지를 저장하는 데 있..
Reactor에서 Test하기reactor-test라는 테스트 전용 모듈을 통해 여러 가지 유형의 테스트를 지원한다.dependencies { testImplementation 'io.projectreactor:reactor-test'} StepVerifier를 사용한 테스팅Reactor에서 일반 적으로 Flux 또는 Mono를 Reactor Seqence로 정의한 후, 구독 시점에 해당 Operator 체인이 시나리오대로 동작하는지 테스트한다.Reactor Seqence에서 다음에 발생한 시그널, 기대하던 데이터들이 emit 되었는지, 특정 시간 동안 emit된 데이터가 있는지 등을 단계적으로 테스트 Signal 이벤트 테스트expectXXXX() 메서드메서드설명expectSubscription()구..
Reactor에서의 디버깅Reactor는 처리되는 작업들이 대부분 비동기적으로 실행되고, Reactor Sequence는 선언형 프로그래밍 방식으로 구성되므로 디버깅이 쉽지않다. Debug ModeHooks.onOperatorDebug()를 통해서 Debug Mode를 활성화하면 Reactor Sequence를 디버깅할 수 있다.@Slf4jclass DebugModeExam { public static Map fruits = new HashMap(); static { fruits.put("banana", "바나나"); fruits.put("apple", "사과"); fruits.put("pear", "배"); fruits.put("grape", "포도"); } public s..