Spring Batch 기본 구조

batch_Arc.svg

10_batch_jobs.svg

Jobs

  1. Cancel Order (1 hour Iter)
    1. Step1 - Order Status Update
      1. ItemReader : Select PAY_FAIL orders
      2. ItemWriter : Update order Status to Cancel & add order Ids on Step Execution Context.
    2. Step2 - Product Stock Update
      1. ItemReader : Get aggregated data from DB with Order IDs in Step Execution Context
      2. ItemWriter : Increase Products Stock

10_cancel_job.svg

  1. Delete Backup Table rows (10 minutes Iter)
    1. Step
      1. ItemReader : Select rows from Backup Table
      2. ItemProcessor
        1. Re-produce Message if status == false
        2. filter output(reproduced msg + status true)
      3. ItemWriter : Delete Rows

10_delete_job.svg

  1. PG Health Check
    1. Tasklet
      1. Send PG API
      2. Update Redis

Cancel Order Step 개선기

  1. JPA Writer 활용 시

    1. Processor 에서 setStatus(CANCEL) 변경 후 Jpa Writer로 업데이트

      • 하지만 select 후 update를 하는 문제가 발생
      • JpaWriter에서 merge가 실행되고, db에 존재하는지 체크 후, 업데이트를 실행으로 인한 select 쿼리 item의 개수만큼 실행됨

      Untitled

  2. ItemWrite를 custom 하게 정의 및 단일 업데이트

    1. update를 select를 하지않기 위해, JPQL을 직접 정의하여 업데이트
      1. Update OrderModel set status = 'CANCEL' where id = :id
    2. JPQL 실행시 flush가 호출되어 1번의 방법보다 현저히 느림
  3. ItemWrite를 custom 하게 정의 및 IN 업데이트

    1. 2번에서 단일 건을 업데이트 하는 것이 아닌, IN 을 활용하여 대용량 업데이트

소요 시간 비교

제목 없는 데이터베이스