실시간 쌓이는 로그를 cron을 사용해서 스케줄링 할 때 curl로 호출한 API가 중복으로 호출되어 실행되는 문제가 있었다.
cron 스케줄링은 crontab에 설정한대로 매 분마다 배치 스크립트 파일을 실행한다.
문제는 API를 호출해서 로그를 처리하는 작업이 쌓인 로그의 양에 따라서 트래픽이 적을 때는 1분 이내로 끝날 수 있다.
하지만 트래픽이 많아서 로그가 많이 쌓이면 처리시간이 1분 이상 걸리면서 배치 주기를 보다 작업이 길어지면서, 이전 배치작업이 끝나지 않았는데 스케줄링에 의해 다음 작업이 호출돼 API가 중복 호출되는 문제가 있었다.
crontab
* * * * * /home/test/log/batch.sh
batch.sh
#!/bin/bash
# 배치 API 호출
/usr/bin/curl -s "http://www.test.com/api/log/batch"
중복 실행 방지 스크립트 작성
서버에서 로그를 배치작업을 하는 API가 배치주기보다 오래 걸리는 문제를 방지하기 위해 락파일을 하나 정의하고 락파일을 체크하는 로직을 통해 진행중인 배치 작업이 있으면 쉘을 종료하도록 구현해줬다.
#!/bin/bash
# lock 파일 경로
LOCK_FILE="/home/test/log/batch.lock"
if [ -e "$LOCK_FILE" ]; then
exit 1
fi
# lock 파일 생성
touch "$LOCK_FILE"
# 배치 API 호출
/usr/bin/curl -s "http://www.test.com/api/log/batch"
# 배치 작업 후 lock 파일 제거
rm -f "$LOCK_FILE"
스크립트 파일에 lock 파일을 체크하는 로직을 추가했다.
cron 스케줄링에 의해 배치가 실행되며 api 시작 전 lock 파일을 생성하고, 서버의 API 작업이 끝나지 않으면 lock 파일은 제거되지 않았기 때문에, 다음 스케줄링으로 쉘이 실행되도 lock 파일이 존재하기 때문에 스크립트는 종료되게 된다.
'DevOps' 카테고리의 다른 글
젠킨스 파이프라인으로 깃허브 SSH 연동 (0) | 2024.12.23 |
---|---|
도커 젠킨스로 깃허브 SSH로 연동 (2) | 2024.12.16 |
Jenkins Github 리포지토리 SSH 연결 에러(stderr: No ED25519 host key...) (0) | 2024.12.14 |
[Docker] 도커파일(Dockerfile) 개념 및 작성법 (1) | 2024.11.28 |
[Apache] 아파치 서버 SSL, 리버스 프록시 설정 (0) | 2024.04.26 |