sourcecode

스프링 배치를 사용한 두 개의 다른 기계의 파일 처리

copyscript 2023. 10. 26. 21:21
반응형

스프링 배치를 사용한 두 개의 다른 기계의 파일 처리

나의 파일 처리 시나리오는,

 read input file -> process -> generated output file

하지만 나는 입력된 모든 파일들을 받는 하나의 저장 영역과 하나의 데이터베이스 서버에 연결된 두 개의 물리적으로 다른 기계를 가지고 있습니다.이 컴퓨터에서 실행 중인 응용프로그램 서버는 두 개(각 서버에 하나씩)입니다.

enter image description here

spring batch를 사용하여 이 두 어플리케이션 서버에서 입력 파일을 병렬로 처리할 수 있는 방법은 무엇입니까? 서버1(P1)에 5, 서버2(P2)에 5 파일이 10개 있다면 할 수 있습니까?

입력 파일당 작업을 예약할 수 있습니다(입력 파일 위치가 작업의 매개 변수가 됨).Spring Batch는 동일한 작업 매개 변수를 가진 두 개의 작업 인스턴스가 생성되지 않도록 보장합니다.당신은 당신을 받을 것입니다.JobExecutionAlreadyRunningException아니면JobInstanceAlreadyCompleteException다른 노드가 이미 동일한 파일을 처리하기 시작한 경우.

먼저 파일을 실제로 절반(5개와 5개)으로 분할할지, 아니면 완료될 때까지 각 서버를 처리할지를 결정하는 것입니다.파일의 크기가 다양하고 크기가 작은 파일이 있고 크기가 큰 파일이 있는 경우, 크기가 다르기 때문에 한 서버에서 6개, 다른 서버에서 4개의 파일을 처리하는 최적의 병렬화를 수행하거나, 크기가 다르기 때문에 3개의 파일을 처리하는 데 걸리는 시간이 7과 3개인 경우에는 7과 3개의 파일을 처리하는 최적의 병렬화를 수행할 수 있습니다.

매우 기본적인 방법은 활성 처리를 나타낼 수 있는 데이터베이스 테이블을 갖는 것입니다.작업은 디렉토리를 읽고 첫 번째 파일 이름을 잡은 다음 해당 JVM에서 처리 중인 테이블에 삽입할 수 있습니다.테이블의 기본 키가 파일 이름이면 둘 다 동시에 시도하면 하나는 실패하고 하나는 성공합니다.테이블에 항목을 삽입하는 데 성공한 사람이 승리하여 파일을 처리하게 됩니다.다른 하나는 해당 예외를 처리하고 다음 파일을 선택한 후 처리 항목으로 삽입해야 합니다.이렇게 하면 각자가 기본적으로 (db 테이블에) 중앙 집중식 잠금을 설정하게 되고, 파일 배포를 균등하게 하는 것보다 파일 크기를 고려하는 보다 효율적인 처리를 할 수 있습니다.

제 제안은 다음과 같습니다.

  • 파일 경로를 기본 키로 하여 db에 잠금 테이블을 만듭니다.그런 다음 이 키를 사용하여 레코드를 삽입합니다. 성공한 경우 코드가 계속되고 실패한 경우(예외로 이 기본 키를 사용한 레코드가 존재함) 파일을 처리한 다음 다음 파일로 이동합니다.

  • 앞서 지미가 언급한 것처럼 정확한 스케쥴링

  • 대기열(예: ActiveMQ, RabittMQ, ...)을 사용하여 시스템을 동기화할 수 있습니다.

아주 간단한 방법이 있습니다.만약 내가 맞는다면 당신은 모든 파일을 데이터베이스에 넣고(그것에 대한 정보의 일부) 제거해서 새로운 출력을 만듭니다.파일을 읽기 전에 잠금()을 설정할 수 있습니다.

  for(File file : fileList.getFiles())
    try{
      (getting file + process it)
       }

그리고 진행중에

     file.lock();
     try {
         ...
     } finally {
         file.unlock();
     }

여기 Lock에 대한 몇 가지 정보가 있습니다.

언급URL : https://stackoverflow.com/questions/16337868/file-processing-on-two-different-machine-using-spring-batch

반응형