ISR (In-Sync-Replicas) 리더 파티션과 팔로워 파티션이 모두 싱크가 된 상태를 뜻한다. 복제 개수가 2인 토픽을 가정해보자. 리터 파티션 1개와 팔로워 파티션 1개가 존재할 것이다. 리더 파티션에 0부터 3의 오프셋이 있다고 가정할때, 팔로워 파티션에 동기화가 완료되려면 0부터 3까지 오프셋이 존재해야한다. 동기화가 완료됐다는 의미는 리더 파티션의 모든 데이터가 팔로워 파티션에 복제된 상태를 말하기 때문이다. 리더 파티션과 팔로워 파티션이 동기화된 상태에서는 리더 또는 팔로워 파티션이 위치하는 브로커에 장애가 발생하더라도 데이터를 안전하게 사용할 수 있다. 팔로워 파티션이 리더 파티션으로부터 데이터를 복제하는 데에 시간이 걸린다. 프로듀서가 특정 파티션에 데이터를 저장하는 작업은 리더 파..
Validator 생성 CustomJobParametersValidator.java import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.JobParametersInvalidException; import org.springframework.batch.core.JobParametersValidator; public class CustomJobParametersValidator implements JobParametersValidator { @Override public void validate(JobParameters jobParameters) throws JobParametersInvalidEx..
Job 생성 import lombok.RequiredArgsConstructor; import org.springframework.batch.core.*; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.core.scope.context.ChunkContext; import or..
토픽 정리 정책(cleanup.policy) 토픽의 데이터는 시간 또는 용량에 따라 삭제 규칙을 적용할 수 있다. 또한 삭제를 원치 않는다면 카프카 클러스터가 살아있는한 토픽의 데이터를 삭제하지 않도록 설정할 수 있다. 데이터가 삭제되지 않고 남아있으면 추후에 데이터가 필요할때 오프셋을 지정해서 일주일, 한달 이상 지난 데이터를 다시 가져올 수 있다. 데이터를 더는 사용하지 않을 경우에는 cleanup.policy 옵션을 사용해서 데이터를 삭제할 수 있다. 옵션은 2가지다. 1) delete : 데이터의 완전 삭제 2) compact : 동일한 메시지 키의 가장 오래된 데이터를 삭제 토픽 삭제 정책(delete policy) 토픽을 운영하면 일반적으로 대부분의 토픽의 cleanup.policy를 dele..
Job 생성 이전에 배웠었던 기본 Job import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.b..
Listner 생성 및 설정 JobRepositoryListener.java import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.batch.core.*; import org.springframework.batch.core.repository.JobRepository; import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor @Slf4j public class JobRepositoryListener implements JobExecutionListener { private final Jo..
BATCH 테이블 Prefix 변경해보기 schema-postgresql.sql org.springframework.batch/spring-batch-core/4.3.5/b5ff5d227600df2ba087344160db2b8a38476cb3/spring-batch-core-4.3.5.jar!/org/springframework/batch/core/schema-postgresql.sql 위 파일의 쿼리를 가져와서, BATCH_ 부분을 SYSTEM_으로 변경해준다. -- Autogenerated: do not edit this file CREATE TABLE SYSTEM_JOB_INSTANCE ( JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY , VERSION BIGINT ..
모든 클래스가 정의해야하는 메서드 자바와 마찬가지로 코틀린 클래스도 toString, equals, hashCode 등을 오버라이드 할 수 있다. 코틀린은 이런 메서드 구현을 자동으로 생성해줄 수 있다. 자동으로 생성해주기전, 메서드를 직접 구현해보자. toString() 구현 자바처럼 코틀린의 모든 클래스도 인스턴스의 문자열 표현을 얻을 방법을 제공한다. class CustomClient(val name: String, val postalCode: Int) { /* toString */ override fun toString() = "Client(name=$name, postalCode=$postalCode)" } equals() 구현 코틀린에서 == 연산자가 내부적으로 equals를 호출해서 객체를 ..
들어가기전 토픽과 파티션의 기본개념 포스팅 바로가기 https://devfunny.tistory.com/380 카프카의 토픽과 파티션, 오프셋 토픽 카프카에서는 프로듀서가 전달하는 메시지를 '토픽'에 저장하고, 컨슈머가 해당 '토픽'에서 메시지를 가져온다고 하였다. 메시지의 저장소 역할을 하는 토픽은 데이터베이스의 '테이블'의 devfunny.tistory.com 토픽 카프카의 시작과 끝이다. 카프카를 사용하는 것은 토픽을 만들면서 시작하고, 토픽을 삭제하면 데이터는 삭제되고 파이프라인은 중단된다. 데이터의 생명주기 한가운데에 토픽이 있다. 적정 파티션 개수 토픽 생성시 파티션 개수 고려사항 - 데이터 처리량 - 메시지 키 사용 여부 - 브로커, 컨슈머 영향도 파티션의 개수가 많아질수록 1:1 매핑되는 ..
인터페이스의 프로퍼티 구현 코틀린에서는 인터페이스에 추상 프로퍼티 선언을 넣을 수 있다. interface InterfaceUser { val nickname: String // 추상 프로퍼티 } InterfaceUser 인터페이스를 구현하는 클래스가 nickname 의 값을 얻을 수 있는 방법을 제공해야한다. 인터페이스에 있는 프로퍼티 선언에는 뒷받침하는 필드나 게터 등의 정보가 들어있지 않다. 사실 인터페이스는 아무 상태도 포함할 수 없으므로 상태를 저장할 필요가 있다면 인터페이스를 구현한 하위 클래스에서 상태 저장을 위한 프로퍼티 등을 만들어야한다. 예시 PrivateUser 별명을 저장만 한다. 주 생성자 안에 프로퍼티를 직접 선언하는 간결한 구문을 사용한다. User의 추상 프로퍼티를 구현하고 ..
ExecutionContext 개념 https://devfunny.tistory.com/485 [스프링 배치] 배치 잡의 세션 ExecutionContext 상황 스프링 배치가 진행중이다. 진행 도중에 오류가 발생했고, 실패한 시점부터 처리를 다시 시작해야한다. 이 경우에 스프링 배치는 실패한 시점을 어떻게 알아낼 수 있을까? 실패시마다, 사 devfunny.tistory.com 실습해보기 ExecutionContextConfiguration.java ExecutionContextTasklet1.java ExecutionContextTasklet2.java ExecutionContextTasklet3.java ExecutionContextTasklet4java ExecutionContextConfigur..
카프카의 AdminClient 제공 실제 운영환경에서는 프로듀서와 컨슈머를 통해 데이터를 주고받는것 만큼 카프카에 설정된 내부 옵션을 설정하고 확인하는것이 중요하다. 내부 옵션을 확인하는 가장 확실한 방법은 브로커 중 한대에 접속하여 카프카 브로커 옵션을 확인하는 것이다. 이는 매우 번거롭다. 카프카 클라이언트에서는 내부 옵션들을 설정하거나 조회하기 위해 AdminClient 클래스를 제공한다. 이 클래스를 활용하면 클러스터의 옵션과 관련된 부분을 자동화할 수 있다. 활용예시 카프카 컨슈머를 멀티 스레드로 생성할때, 구독하는 파티션 개수만큼 스레드를 생성하고 싶을때, 스레드 생성 전에 해당 토픽의 파티션 개수를 어드민 API를 통해 가져올 수 있다. AdminClient 클래스로 구현한 웹 대시보드를 통..