inflearn logo
강의

講義

知識共有

カカオ面接官の実務密着型Spring Batch:大容量データ処理のすべて

Spring Schedulerを活用したバッチスケジューリングパターン

여러 파드 환경에서 단일 실행 보장 방식

解決済みの質問

19

DongHyun Gu

投稿した質問数 1

0

단일 실행이 보장되는 이유로 Db를 통해서 값을 가져오고 있으며 db에서 동시성을 방어해주고 있기 때문이라고 해주셨는데요.

FindRunningJobExecutions 는 단순 select문이 아니고 내부적으로 비관적 락으로 동시 접근을 막아주는 구조인가요? 저는 여러 파드인 상황에서는 보여주신 코드가 동시성 이슈로 인해 주어진 잡이 한 번만 실행된다는 것을 보장하기 힘들 것 같다고 생각했습니다.

이외에도 여러 파드인 상황이라면 실무에서 어떤 요소를 고려하는지 궁금합니다.

  1. 학습 내용에선 currentimestamp를 잡 파라미터에 넣어서 매번 새로운 잡 인스턴스로 취급/실행하는 형태를 보여주셨는데, 이로인해 멀티파드 환경에서 특정 잡의 중복 실행 방지 혹은 특정 잡 파라미터 구성에서의 중복 실행 방지에 대한 요건 구현 시 영향도/고려 사항이 있는지 여부와 아니면 currentimestamp 잡 파라미터를 실무에서 빼기도 하는지 궁금합니다

  2. 운영 시 중복 실행 문제 및 잡 재시도에 대해 고민하다 나온 질문입니다. 혹시 애초에 대부분의 배치 잡과 스탭 로직을 멱등하게 동작하도록 설계 및 코드 작성을 해야하는 걸까요?

java spring spring-boot spring-batch spring-framework

回答 2

0

Hong

안녕하세요 DongHyun Gu님 질문 남겨주셔서 감사합니다.

당연하게도 여러 인스턴스가 구성된 환경에서는 한계가 있습니다. 그리고 데이터 모듈이라는거 자체가 보통은 하나의 인스턴스로 유지가 된다고 가정하고 촬영되었습니다.

  • 물론 상황에 따라서 감당이 안된다면 여러개가 존재 할 수 있겠죠

 

파드가 여러개인 상황에서 고려해야하는 부분은 다양하게 있겟지만 우선 질문 주신 내용을 기준으로 한번 다뤄보도록 할게요.

 

  1. currentTimeStamp

당연하게도 해당 값은 매번 key가 달라지니 유니크 제약 방어가 무력화됩니다. 멀티 파드에서 동시 트리거되면 둘 다 새 인스턴스로 실행돼요

 

그래서 이걸 보장하기 위해서 다양한 방식이 있을텐데, 대표적으로

  • ShedLock : 가장 흔한 방식으로 DB 락 테이블 방식

  • Quartz Cluster Mode : 스프링 배치와 별개로 클러스터 락을 잡아버림

  • K8s CronJob + 단일 Pod: 잡에 대한 트리거를 K8s가 담당을 하게 되고, 앱 파드는 그냥 워커 형태로 구현 형태가 단순합니다.

  • Airflow/Argo Workflows: 사실상 단일 인스턴스로 안된다면 대용량을 위한 오케스트레이션으로 변경

이정도가 될꺼같아요.

 

  1. 멱등성은 기본적으로 Batch처리에서 보장해야 하는 옵션입니다. 이건 우리가 다시 실행하는 케이스들이 많기 떄문에 멱등하게 구성하시는게 좋으실거에요.

 

혹시 추가적인 질문 있다면 부탁드립니다. 감사합니다.

 

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. DongHyun Gu님.

여러 파드 환경에서 단일 실행을 보장하는 방법에 대해 궁금하신 점을 이해하고 있습니다. 큰 트래픽을 처리하거나 높은 신뢰성이 요구되는 환경에서는 여러 파드 환경 내에서 한 번에 하나의 Job만 실행되도록 보장하는 것이 중요합니다.

Spring Batch에서는 비관적 락낙관적 락 둘 다 사용할 수 있지만, FindRunningJobExecutions의 경우 주로 비관적 락이 아닌 터미널의 동시성을 피하기 위한 방법으로 동작합니다. 여러 파드에서의 동시 실행 문제를 해결하기 위해서 다음과 같은 방법들을 고려할 수 있습니다:

  1. DB 락 사용: 데이터베이스에서 비관적 락을 사용하여 한 번에 하나의 트랜잭션이 Job을 업데이트할 수 있도록 합니다. 이는 주로 설정을 통해 반복적 접근 시 동시성 문제를 피하기 위해 사용됩니다.

  2. 잡 인스턴스 파라미터 관리: currentimestamp 등의 파라미터를 이용해 매번 새로운 잡 인스턴스를 생성할 수 있습니다. 이 방법은 멀티파드 환경에서 중복 실행을 방지할 수 있습니다. 단, 이런 파라미터는 주의해서 사용해야 하며, 실무에서는 반복적으로 동일한 작업이 실행되어야 하는 경우 오히려 문제가 될 수 있으니 상황에 맞게 조정합니다.

  3. 스케줄링 컨트롤러 사용: Kubernetes 등에서 스케줄링 컨트롤러를 이용하여 동작 시점을 컨트롤 할 수 있습니다. 이는 특정 파드에서만 Job이 구동되도록 제한하는 방식입니다.

  4. External Locking: Redis 등 외부 시스템을 이용한 락을 구현하여, 클러스터 환경에서도 단일 실행 환경을 조성할 수 있습니다.

좀 더 깊이 있는 논의와 예시는 아래 유사한 질문 내용을 참고하시기를 추천합니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

궁금한점이 여러개 생겼습니다.

0

18

0

혹시 수업자료는 다운받을 수 있는 곳이 없나요?

0

22

2

코테 사이트 로그인 불가

0

18

1

XAMPP에서 Apache, DB 재기동 시 접속안되는 문제

0

15

1

실습 권한이 없네요··· 이건 ··· 좀··· 401 에러떠요

0

27

3

훅 내용 안뜸 오류

0

25

2

inheritance startegy 선택시 고려사항

0

18

1

[할인쿠폰] 코테의 바이블[JAVA] 50% 할인 쿠폰 관련

0

20

1

챗봇 기능 구체화 (RAG)

0

27

2

Entity 동등성 비교

0

16

1

패키지 구분에 대해 궁금한게 있습니다

0

22

2

안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.

0

26

1

스프링부트 서버 에러나요

0

23

1

갑자기 채점 사이트가 바뀌었어요

0

31

1

코드 자료

0

45

2

2026.04에 추가된 강의 시청 불가

0

36

1

Service Create/Update Record 운용과 Delete Record 미운용의 차이 질문

0

26

1

문제 리스트 페이지

0

26

1

인가 코드 발급(프론트 vs 백)

0

30

2

part8 Notion 링크

0

29

1

채점 사이트 관련 질문드립니다

0

23

1

인텔리제이 MCP 서버 설정 관련

0

34

2

조회속도 개선에서 더 개선하는 방법이 궁금합니다.

0

36

2

job, step execution 관련 질문 드립니다.

0

41

2