요구사항
: 정해진 마감기한이 지난 입찰데이터에 대해 JPA 를 사용하여
{ 해당 입찰데이터의 주인인 고객들에게 포인트 반환하는 update query 를 작성 & delete query 를 호출 }
- 데드라인데이터가 금일 24시 이전의 고객들을 select
- select 한 고객들에 대해서 포인트를 update
하는 배치 함수를 작성, 이 배치함수는 매일 24:00에 호출되어야만 함.
단점
- 애초에 Spring Cloud Function 는 batch process 를 위한 기술이 아님.
- msa 이벤트 트리거용 → Kafka, MQ 작업 트리거용도
- 아래와 같은 지원이 불가능함
- retry logic, chunk-oriented processing, and job scheduling.
- retry 도 안 되고, 배치 실패했는지 체킹하기가 어렵다
- aws lambda 의 cold start로 인해 latency 가 일어날 수 있음
장점
- 태스크가 간단하고 event driven 이라면 적합
- 서버 관리를 할 필요가 없음
- spring batch 와 마찬가지로 스케줄러 적용이 가능함
- 허들이 높지 않음
Spring Cloud Function + Spring Batch 하면 안되나??
나는 24시간 내내 EC2로 스프링 띄우기 보다, 콜드스타트를 고려하더라도 스프링을 띄워서 배치 라이브러리까지 활용할 수 있겠다 싶었는데
라고 생각한 순간, Spring Batch 의 트리거가 cron으로 동작한다면, 람다가 외부에서 호출될 때 그에 맞춰 배치 돌리는 타이밍 잡기가 힘드려나??
배치 공부도 해야겠구만..
Spring Cloud Function 가 배치보다 좋은 점
AWS Lambda 로 작성가능할 듯,,,?? (JPA 안 쓰고도 가능할 듯,,?)
-- 데드라인 데이터가 금일 24시 이전인 고객들을 선택하고, 해당 고객들에 대해 포인트를 반환하는 UPDATE 쿼리를 작성합니다.
UPDATE gream.tb_user AS u
INNER JOIN gream.tb_buy AS b ON u.id = b.user_id
SET u.point = u.point + <추가할_포인트_양>
WHERE DATE(b.deadline_at) = CURDATE() AND HOUR(b.deadline_at) < 24;
-- DELETE 쿼리를 호출하여 선택된 입찰 데이터를 삭제합니다.
DELETE b
FROM gream.tb_buy AS b
WHERE DATE(b.deadline_at) = CURDATE() AND HOUR(b.deadline_at) < 24;