AWS
N 시간 후에 특정 로직을 수행하는 스케줄러
secretjuju
2024. 4. 23. 02:24
주의
이 포스트를 쓰고난 후 AWS EventBridge 를 사용하면 더 간단하게 구현 가능하다는것을 확인했습니다. 🥲
들어가며
회사에서 다음과 같은 상황이 생겼다.
A 라는 세션을 생성하고 N 시간을 기다린 후 세션을 유지 할 것인지 확인하는 로직이 필요하다.
- CronJob 을 1분마다 실행하여 각각의 세션별로 시작시간, 기다릴 시간을 비교하여 세션을 유지 할 것인지 묻는 로직을 각각 실행한다.
- Redis 의 expire event 를 사용하여 특정 시간이 지난 후 event 를 listen 할 수 있도록 한다.
- AWS Batch 를 이용하여 작업을 스케줄링한다.
- Step function 으로 payload.N 만큼의 시간을 기다린 후 SQS 로 payload 를 전송한다.
위와같이 4가지의 방법을 생각 해 보았는데 그중 1가지 4번 (SQS + Step function 을 사용하는 방법)에 대해 조사해보고 포스팅 해 보자 한다.
이유는 다음과 같다.
- Cron Job 으로 처리하는경우 한번에 수십 ~ 백단위가 될 수 있는 세션들을 조회하여 각각 N 시간을 기다렸는지 확인 후 세션을 유지 할 것인지 확인하는 로직을 실행해야한다. 이는 비효율적으로 느껴졌기에 일단 제외하였다.
- Redis 의 Expire event 를 사용하는 방식은 모든게 잘 풀렸을경우 아주 좋아보였다. 구현하기도 쉽고 추가비용도 들이지 않으며 각각의 세션별로 로직을 수행할 수 있었다. 하지만 Redis 가 잠깐 죽는다거나 api 서버가 어떠한 (aws 네트워크오류 등등) 이유로 redis 이벤트를 받지 못하면 사용자의 세션을 제한하기 힘들것이다. -> failover 하기 힘들다.
- AWS Batch 는 일반적으로 큰 규모의 데이터 처리 작업 사용된다고 하여 사용 목적과 다소 벗어나는 것 같다고 느꼈다.
github: https://github.com/SecretJuJu/job-scheduling/tree/main/scheduling-serverless
AWS Step Function + SQS 설정
serverless 를 이용하여 step function 과 endpoint lambda, sqs 관계를 설정 해 주었다.
상태머신 대시보드에서 waitTime 파라미터를 5초로 주고 실행하니 5초뒤에 sqs 메시지가 오는것을 확인했다.
이렇게하면 특정시간이 지난 후에 메시지를 받아야하며 누락되면 안되는 이벤트를 처리할때 유용하게 사용할 수 있을 듯 하다.
다만 step function 은 한 계정당 최대 1000개씩만 동시실행 가능하다.
서비스가 성장하고있다면 동시성 상향을 요청할 수 있다고 한다.