𝗟𝗮𝗿𝗮𝘃𝗲𝗹 𝗝𝗼𝗯 𝗕𝗮𝘁𝗰𝗵𝗶𝗻𝗴을 활용한 𝗖𝗦𝗩 𝗜𝗺𝗽𝗼𝗿𝘁𝘀 확장(𝗦𝗰𝗮𝗹𝗶𝗻𝗴)

B2B SaaS 클라이언트는 종종 대용량 파일을 업로드합니다. 10만 행이 포함된 CSV 파일을 상상해 보세요.

대부분의 개발자는 실수를 합니다. 루프를 사용하여 10만 개의 개별 백그라운드 작업을 보냅니다. 이는 문제를 야기합니다.

만약 45,000번째 작업이 실패한다면, 사용자에게 이를 알릴 방법이 없습니다. 진행 상황을 추적할 수도 없고, 파일 전체 처리가 완료되었을 때 단 한 번의 이메일을 보내는 것도 불가능합니다. 작업들이 서로 단절되어 있기 때문입니다.

이를 해결하려면 Laravel Job Batching이 필요합니다.

해결책: Bus::batch()

Job batching은 수천 개의 작업을 하나의 단위로 그룹화합니다. Laravel은 이 단위에 고유한 ID를 부여합니다. 프론트엔드는 이 ID를 사용하여 진행률 표시줄(progress bar)을 보여줄 수 있습니다. 또한 성공 또는 실패를 처리하기 위한 훅(hook)도 제공합니다.

구현 방법:

  • 메모리 효율적인 generator를 사용하여 CSV를 읽습니다.
  • 데이터를 관리 가능한 크기로 청크(chunk)로 나눕니다.
  • Bus::batch()를 사용하여 작업을 그룹화합니다.
  • allowFailures()를 사용하여 잘못된 행 하나 때문에 전체 프로세스가 중단되지 않도록 합니다.

라이프사이클 훅(lifecycle hooks)은 다음과 같이 작동합니다:

  • then(): 모든 작업이 성공했을 때만 실행됩니다.
  • catch(): 첫 번째 오류가 발생했을 때 실행됩니다.
  • finally(): 일부 작업이 실패하더라도 모든 작업이 완료되면 실행됩니다.

사용자 측면의 이점

React 프론트엔드에서 batch ID를 폴링(poll)할 수 있습니다. 이를 통해 0-100% 진행률 표시줄을 보여줄 수 있습니다. 이는 정체를 알 수 없던 백그라운드 작업을 투명한 경험으로 바꿔줍니다.

엔지니어링 측면의 가치

분산된 작업에 대한 제어권을 얻을 수 있습니다. 조용히 발생하는 실패(silent failures)를 방지할 수 있습니다. 사용자에게 실시간 데이터를 제공할 수 있습니다. 후처리 로직이 정확한 시점에 실행되도록 보장할 수 있습니다.

출처: https://dev.to/iprajapatiparesh/scaling-csv-imports-master-laravel-job-batching-iaa