스프링 배치 - 멀티 스레드 처리
대량의 데이터를 처리할 때 배치를 이용하게 될 때 단일 스레드 보다 멀티 스레드를 이용하여 처리하는 방법에 대해 알아보겠습니다.
스레드 개념
단일 스레드 - 프로세스 내 특정 작업을 처리하는 스레드가 하나일 경우 단일 스레드
멀티 스레드 - 여러 개일 경우 멀티 스레드 정의
단, 멀티 스레드 처리 방식은 데이터 동기화 이슈가 존재 하기 떄문에 최대한 고려해서 결정해야 합니다.
스프링 배치 멀티 스레드 프로세싱
Main Thread 부터 시작하면 스프링 배치에서는 반복작업을 수행하기 위해 RepeatTemplate 을 사용하는데 멀티스레드에서는 RepeatTemplate을 상속받은 TaskExecutorRepeatTemplate 통해서 반복을 시킵니다.

TaskExecutorRepeatTemplate 이 반복자로 사용되며 설정한 개수 (ThrottleLimit) 만큼의 스레드를 생성하여 수행하게 됩니다.

TaskExecutor는 스레드를 생성하고 관리합니다.
execute() 가 실행이되고 TheadPool 에서 여러 Thread가 관리됩니다. 이 작업에서 TaskExecutor 는 Runnable 작업을 스레드 풀에 제출하여 병렬로 실행하게 합니다.
TaskExecutor가 execute 할때마다 runnable이 생성되는 구조 입니다.
thread 마다 executingRunnable 클래스가 할당이 되서 각각 실행됩니다. ExecutingRunnable 객체를 생성하고, 이를 TaskExecutor를 통해 비동기적으로 실행합니다.

TaskExecutorRepeatTempalte run() 메소드
ExecutingRunnable 클래스안에 run 메소드가 실행되면 RepeatCallback 메소드가 실행됩니다.
callback.doIntIteration이 executingRunnable 에서 별도의 스레드에 의해 생성된다. 그리고 이 result는 repeatStatus를 가지고 있다. (반복할지, 안할지)
executeRunnable을 queue에 담는다.
작업의 결과는 BlockingQueue를 통해 수집되며, 큐가 비어 있을 경우 결과가 추가될 때까지 기다립니다.

Thread-Safe
Worker1, Woker2, Woker3 은 ChunkOrientedTasklet을 공유합니다.
ItemReader 부분에서 Item을 담는 Chunk는 새롭게 생성됩니다. 그래서 Thread-Safe하게 된다. 같은 데이터를 읽어오지 않도록 Thread-Safe하게 처리가 되어야 합니다.
각각의 스레드는 Stack을 가집니다.
LIFO, 가장 마지막에 담은 데이터를 가장 먼저 가지고 오게되는데, 스프링 배치에서 아이템 리더 실행할때마다 새로운 Chunk 매번 생성됩니다.
각각의 스레드가 그 Chunk값을 가지고 있습니다.

'IT' 카테고리의 다른 글
가상 면접 사례로 배우는 대규모 시스템 설계 기초 1장 - 사용자 수에 따른 규모 확장성 (2) (0) | 2024.07.21 |
---|---|
가상 면접 사례로 배우는 대규모 시스템 설계 기초 1장 - 사용자 수에 따른 규모 확장성 (1) (0) | 2024.07.14 |
zipkin (2) | 2024.07.01 |
스프링 클라우드 슬루스와 집킨 정리 (0) | 2024.06.30 |
트랜잭션 (0) | 2024.05.26 |
댓글
이 글 공유하기
다른 글
-
가상 면접 사례로 배우는 대규모 시스템 설계 기초 1장 - 사용자 수에 따른 규모 확장성 (2)
가상 면접 사례로 배우는 대규모 시스템 설계 기초 1장 - 사용자 수에 따른 규모 확장성 (2)
2024.07.21캐시 사용시 주의점갱신은 자주 일어나지 않지만 참조는 빈번이 일어난다면 고려할만 하다.일반적으로 RAM에서 동작캐시는 휘발성이므로 영속적으로 보관할 데이터는 캐시에 두는것이 바람직하지 않다.캐시는 언제 어떻게 만료(expire)되는가?에 대한 정책을 수립할 필요가 있다. 만료시간을 너무 짧게, 너무 길게 가져가지 않도록 주의해야한다.데이터베이스와 일관성을 어떻게 유지할 것인가? 에 대한 생각도 해봐야한다. 찾아보니 이는 논문도 나올정도로 많은 연구가 진행되고 있는 것 같다.장애에는 어떻게 대처할 지도 생각해봐야한다. 캐시 서버를 하나로 두면 해당 서버는 단일 장애 지점이 되어버릴 가능성이 있다. 때문에 여러 지역에 걸쳐 캐시 서버를 분산 시켜야 한다.단일 장애 지점(Single Point of Failu… -
가상 면접 사례로 배우는 대규모 시스템 설계 기초 1장 - 사용자 수에 따른 규모 확장성 (1)
가상 면접 사례로 배우는 대규모 시스템 설계 기초 1장 - 사용자 수에 따른 규모 확장성 (1)
2024.07.14단일 서버11st에 접속할때 서버에서 어떤일이 일어나는지 생각해보자.www.11st.com를 주소창에 입력브라우저의 DNS 캐시 확인 브라우저 캐시에 IP 주소가 없으면 운영 체제의 DNS 캐시 확인운영 체제의 DNS 캐시에도 IP 주소가 없으면 루트 DNS 서버로의 쿼리 시작루트 DNS 서버는 com 최상위 도메인(TLD) 서버의 주소를 반환DNS 클라이언트는 com TLD 서버에 www.11st.com의 IP 주소를 요청com TLD 서버는 11st.com 도메인의 권한 있는 네임 서버의 주소를 반환DNS 클라이언트는 11st.com 도메인의 권한 있는 네임 서버에 www.11st.com의 IP 주소를 요청합니다.권한 있는 네임 서버는 www.11st.com의 IP 주소를 반환브라우저는 반환된 IP … -
zipkin
zipkin
2024.07.01들어가기트위터에서 개발되서 사용하고 있는 분산 추적 도구입니다. 마이크로서비스 환경에서는 하나의 Request 요청에 대해 여러개 서비스들이 호출되곤 합니다. 이때, 데이터를 받아오는 다소 무거운 API가 있으면 Spring 서버의 경우 스레드가 묶여 버리는 일종에 병목 현상의 문제가 발생할 수 있습니다. 이런 경우를 대비하여 모니터링이 필요하게 됩니다. Zipkin을 통해서 이러한 병목 현상을 대비할 수 있는 모니터링 역할을 수행하게 됩니다. Twitter 에 공개되어 있는 Distributed Systems Tracing with Zipkin 본문 링크입니다. 조금 오래된 문서이긴 하지만 zipkin 등장이유와 동작방식에 대해 확인해볼 수 있습니다. Zipkin 이란 무엇인가?Zipkin은 분산환경… -
스프링 클라우드 슬루스와 집킨 정리
스프링 클라우드 슬루스와 집킨 정리
2024.06.30스프링 클라우드 슬루스와 상관관계 ID상관관계 ID가 존재하지 않는다면 상관관계 ID를 생성해서 서비스 호출에 삽입한다.아웃바운드 서비스 호출에 대한 상관관계 ID 전파를 관리하여 트랜잭션에 대한 상관관계 ID가 자동으로 추가되도록 한다.서비스 A는 서비스 B에 HTTP 요청을 보낼 때, HTTP 헤더에 X-Correlation-ID: abc123를 포함시켜 보낸다.서비스 B는 요청을 수신하여 X-Correlation-ID 헤더에서 상관관계 ID를 읽어들이고, 이 ID를 사용하여 자신의 작업을 추적한다.@Configurationpublic class FeignConfig { @Bean public RequestInterceptor requestInterceptor() { r…
댓글을 사용할 수 없습니다.