뒤로
한경민
·
우리42벤트 문제 해결 사례 - crontab 으로 공휴일 데이터 fetch 자동화 & redis 캐싱
0 배경
- 공휴일 정보의 경우 어떤 클라이언트가 요청하던지 변하지 않는 데이터인데, 캘린더 표시 월이 바뀔 때마다 공공데이터포탈 Open API 로 데이터를 fetch 해야한다.
1 문제 정의
- 서비스가 외부 API 서버의 상태에 의존적이다.
- 공휴일 데이터 fetch 가 오래 걸려서 요청 응답, 캘린더 렌더링이 느려진다.
- API 서버가 안정적이지 않아서 정확하지 않은 정보가 캘린더에 표시될 때가 있다.
- 불필요한 네트워크 overhead. 변하지 않는 데이터에 대해 반복적으로 외부 요청을 보내야한다.
- 클라이언트의 상태에 영향을 받지 않는 데이터를 반복적으로 외부 서비스에 요청해야한다.
2 해결책
- 서비스 배포 전 +-12개월 공휴일 데이터를 fetch 받아서 각 월별
m_{year}{month}:stringified 공휴일 날짜 array형태로 redis 에SET하여 캐싱. - 공휴일 데이터 API 서버가 안정적이지 않아서 24개월치 공휴일을 한꺼번에 요청할 때 실패하는 연월들이 생긴다.
Promise.allSettled로 비동기 요청들을 보내고, 성공 실패 여부를 각 연월별로 ‘fulfilled’ / ‘rejected’ 여부로 STDOUT 으로 로깅.- 이미 캐싱에 성공한 연월은 redis
EXISTS로 확인하여 다음 시도에서 제외하고, 24개월 데이터가 모두 캐싱될 때까지 script 를 재실행한다. 보통 두번 하면 다 성공. - crontab 으로 매월 첫째날 3AM 에 다음 해 해당 월 공휴일 데이터 fetch.
0 3 1 * * [node executable path] [script path] >> ~/log/our42vent/updateHolidays.log 2>&1
- eviction policy - 캐시 값들을 영구적으로 쌓을 수 없기 때문에 캐싱된 달의 1일로부터 +12개월 후에 캐시 값 지워지도록 TTL 설정.
- 결과적으로 항상 +-12개월 공휴일 데이터 캐싱. 그 외의 범위는 공휴일을 표시하지 않는다.
2
댓글
로그인 후 댓글을 남길 수 있습니다.
아직 댓글이 없습니다.