프로젝트
-
kafka auto commit의 위험성프로젝트/kafka 2023. 11. 4. 00:01
개요kafka auto commit에 대해 명확히 이해하고 kafka auto commit을 활용했을 때 위험성에 대해 알아보고자 합니다. auto commit이란?kafka poll()을 통해 가져온 레코드를 어디까지 읽었는지 자동으로 commit 할 수 있는 옵션인 auto.commit을 제공합니다.enable.auto.commit = trueenable.auto.commit = trueauto.commit.interval.ms = 100ms 위의 설정은 100ms 시간의 간격마다 auto commit을 수행한다는 것을 의미 합니다. 뭔가 자동으로 해준다? 편리하게 사용할 수 있을 것 같은 느낌듭니다. 예를 들어 poll()을 통해 500개의 레코드를 가져옵니다. 100ms가 지났을 때는 100개..
-
kafka의 graceful shutdown프로젝트/kafka 2023. 11. 2. 00:01
개요Spring Kafka의 Consumer를 활용하다가 graceful shtudown을 어떻게 지원하는지 궁금해졌습니다.만약 offset을 commit 하기 전에 SIGTERM, SIGINT와 같은 종료 요청이 오면 어떻게 될까요? Shutdown SignalSIGKILL (9): SIGKILL signal 은 프로세스를 즉각 종료할 때 사용한다.SIGINT(2): 사용자의 요청으로 중단이 될 때 사용한다. (e.g., Ctrl+C).SIGTERM(15): SIGTERM signal 종료 요청을 보낸다, 요청을 보낼 뿐 SIGKILL은 아니다. kafka의 immediate-stop 옵션Container가 stop 되었을 때 현재 record를 처리하고 종료할지, 이전에 poll 한 모든 메시지를 처..
-
Spring Boot + Redis 대기열 시스템 만들어보기 - 이론편프로젝트/선착순 쿠폰 발급 시스템 2023. 10. 29. 00:01
개요 이전부터 만들어보고 싶었던 대기열 시스템을 만들어보고자 합니다! 일시적으로 많은 트래픽이 발생하는 경우에 과도한 트래픽의 유입을 방지해 주는 대기열 시스템입니다. 특정 이벤트가 있을 때 예측된 트래픽을 대비하여 Scale out 할 수 있지만 폭주하는 짧은 기간이 지나가면 대부분의 자원들은 낭비됩니다. 이런 상황일 때 대기열 시스템을 도입할 수 있습니다. Redis 활용 이유 redis의 자료구조 중 sorted set을 활용하게되면 rdb를 활용하는 것보다 성능적인 면에서 우수합니다. Redis는 In-memory 저장소로 높은 처리량을 가지고 있기 때문에 많은 트래픽을 잘 버틸 수 있습니다. 많은 트래픽이 한번에 DB로 부하가 가지 않게 됩니다. Redis Sorted Set이란? score에 ..
-
Redis를 통해 분산락 구현하기 - 실전편프로젝트/redis 2023. 10. 27. 00:01
Redis를 통해 분산락 구현하기 - 이론 편에 이어 실제로 구현을 해봅니다. 100장의 티켓을 구매하는 여러 스레드의 요청에도 분산락을 통해 예상한 대로 매진 시 0건 이하가 발생하지 않거나 50건의 요청이 있었다면 티켓 50장이 남아있는지 시나리오를 통해 동시성이 잘 제어되는지 확인해보려 합니다. 개발 환경 Spring Boot 3.1 Java 17 Redisson 의존성 추가 implementation ("org.redisson:redisson-spring-boot-starter:3.18.0") RedissonConfig 설정 @Configuration class RedissonConfig { @Value("\${spring.data.redis.host}") private val redisHost:..
-
Redis를 통해 분산락 구현하기 - 이론편프로젝트/redis 2023. 10. 25. 00:01
분산락이란 무엇일까? 여러 개의 분산된 서버가 존재할 때 동일한 데이터에 대한 동기화를 보장하기 위해 사용하는 락의 종류 중 하나입니다. 분산락은 어떤 상황에서 필요할까? Java Spring 기반의 웹 애플리케이션은 기본적으로 멀티 스레드 환경에서 기동 됩니다. 이에 따라 여러 스레드가 함께 접근할 수 있는 공유자원에 대해 race condition이 발생하지 않도록 별도의 처리가 필요합니다. Java의 synchonized라는 키워드를 통해 해결할 수 있지만, 서버를 여러 대 사용하여 분산되어 있는 상황에서는 사용하기 어렵습니다. 이런 상황일 때 분산락을 활용하여 해결할 수 있습니다. MySQL의 네임드락 대신에 SELECT FOR UPDATE을 활용할 수도 있습니다. 하지만 그런경우 timeout ..
-
Spring Batch Skip Policy프로젝트/스프링 배치 튜토리얼 2023. 10. 12. 00:01
개요 Spring Batch를 실행하다가 예외가 발생하면 어떻게 되는지 알아보고, 안정적인 Batch Application을 만들기 위해서 어떤 방안이 있는지 알아보고자 합니다. 예외가 간헐적으로 발생하는 Batch Application 구성 @Profile("skip-job") @Configuration class SkipJobConfig( private val jobRepository: JobRepository, private val batchTransactionManager: PlatformTransactionManager, ) { @Bean fun skipJob(): Job { return JobBuilder("skipJob job", jobRepository) .incrementer(RunIdI..
-
Spring Batch 데이터베이스와 함께 사용하기프로젝트/스프링 배치 튜토리얼 2023. 10. 11. 00:01
개요 지난 글에서는 Job을 만들고 메모리에서 값을 생성해 내고 log를 write 해내는 방식으로 작업을 수행하였습니다. 이번글에서는 Database와 연동하여 값을 읽고 쓰는 작업을 수행해보고자 합니다. Gradle Dependencies 추가 dependencies { implementation ("org.springframework.boot:spring-boot-starter-data-jpa") } jpa 관련 의존성을 추가해주었습니다. TestEntity, TestRepository 세팅 및 데이터 생성 @Table(name = "test_table") @Entity class TestJpaEntity( @Id val id: UUID = UUID.randomUUID(), @Enumerated(E..
-
Spring Batch 프로젝트 생성하기 - Spring Boot 3.1프로젝트/스프링 배치 튜토리얼 2023. 10. 9. 00:01
개요 Spring Boot가 3.0이 출시되면서 Batch도 조금 바뀌게 되어 프로젝트를 생성 및 간단한 실행을 수행해보고자 합니다. Gradle Dependencies dependencies { implementation("org.springframework.boot:spring-boot-starter-batch") runtimeOnly("org.postgresql:postgresql:42.3.5") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.batch:spring-batch-test") implementation(project(":core")) ..