개발이야기 012. talkit.bank 스케쥴러 선택을 위한 고려
어제 말씀 드린 세가지 crontab, Celery + Django/Flask + Database, MariaDB Event Scheduler 세가지에 대해서 비교를 해보았습니다.
1. crontab (리눅스 기본 스케줄러)
특징
리눅스에서 기본 제공되는 작업 스케줄러.
시스템 명령어 또는 스크립트를 특정 시간 간격에 맞춰 실행.
설정은 간단하지만 복잡한 워크플로우 관리에는 제약이 있음.
장점
가볍고 간단: 추가 설치 필요 없음.
크론 표현식 지원: 자유로운 시간 설정 가능 (초 단위는 미지원).
다양한 작업 실행 가능: 스크립트, 명령어, Python, Shell 등 모든 종류의 작업 실행.
단점
상태 관리 및 로깅 부족: 실패한 작업의 자동 재시도 없음.
복잡한 의존성 관리 불가.
시스템 재부팅 시 일부 작업이 누락될 수 있음.
사용 예시 (crontab -e
명령으로 설정)
0 3 * * * /path/to/script.sh # 매일 새벽 3시에 스크립트 실행
*/5 * * * * python3 /path/to/my_script.py # 5분마다 Python 스크립트 실행
2. Celery + Django/Flask + Database (비동기 작업 및 복잡한 스케줄링)
특징
Python 기반 비동기 작업 큐, Redis 또는 RabbitMQ와 MariaDB, MySQL, PostgreSQL 등의 데이터베이스를 연동.
Django 또는 Flask와 완벽하게 통합 가능.
복잡한 작업 플로우 관리에 강력함 (다중 작업, 병렬 처리 가능).
장점
비동기 작업: 작업이 오래 걸려도 웹 요청을 블로킹하지 않음.
주기적 작업 관리:
django-celery-beat
로 데이터베이스에 스케줄 저장 및 관리.자동 재시도 및 실패 처리 지원.
확장성: 작업을 분산 처리 가능.
단점
시스템 리소스 소비가 비교적 큼 (특히 Redis/RabbitMQ 필요).
초기 설정이 복잡할 수 있음 (Celery + Redis/RabbitMQ + DB 연동).
Django/Flask 외부에서 단순하게 사용하기는 어려움.
사용 예시 (tasks.py
작성)
from celery import shared_task
from datetime import datetime
@shared_task
def print_current_time():
print(f"현재 시간: {datetime.now()}")
Beat 스케줄 설정 (django-celery-beat
)
from celery import Celery
app = Celery('my_project')
app.conf.beat_schedule = {
'print-time-every-10-seconds': {
'task': 'my_project.tasks.print_current_time',
'schedule': 10.0 # 10초마다 실행
},
}
3. MariaDB Event Scheduler (데이터베이스 내장 스케줄러)
특징
MariaDB 내장 스케줄링 기능으로 SQL 쿼리를 주기적으로 실행.
데이터베이스 관리 작업 자동화에 적합 (예: 백업, 데이터 정리, 통계 기록).
외부 스크립트 실행은 불가능하며, SQL 작업에 한정됨.
장점
간단하고 가벼움: MariaDB에서 기본 제공.
데이터 정리, 통계 및 로그 관리에 적합.
트리거 및 스토어드 프로시저와 함께 사용하면 강력한 기능 제공.
단점
SQL 쿼리만 실행 가능. 외부 프로그램이나 스크립트는 지원하지 않음.
복잡한 워크플로우 관리 불가.
작업 실패 시 자동 재시도 없음.
사용 예시 (SQL
)
CREATE EVENT my_hourly_event
ON SCHEDULE EVERY 1 HOUR
DO
INSERT INTO logs (message, created_at) VALUES ('Hourly event triggered', NOW());
비교 요약
기능 | crontab | Celery + Django/Flask | MariaDB Event Scheduler |
---|---|---|---|
설치 및 설정 | 매우 간단 | 다소 복잡 (Celery, Redis/RabbitMQ 필요) | 매우 간단 (MariaDB 내장 기능) |
작업 종류 | 스크립트, 명령어 실행 | Python 작업, 복잡한 비동기 워크플로우 | SQL 쿼리 실행 |
복잡한 작업 흐름 관리 | 불가 | 가능 | 불가 |
자동 재시도 및 실패 관리 | 없음 | 가능 | 없음 |
로깅 및 모니터링 | 수동 설정 필요 | 내장 대시보드 및 로깅 지원 (Flower ) | SQL 테이블에 직접 기록 |
확장성 | 낮음 | 높음 (분산 작업 가능) | 낮음 |
리소스 소비 | 적음 | 중간~높음 (Redis/RabbitMQ 리소스 사용) | 매우 적음 |
사용 사례 | 단순 스케줄 작업 | 비동기 작업, 복잡한 데이터 처리 | DB 유지보수, 데이터 관리 자동화 |
추천 사용 사례
crontab: 단순한 서버 유지보수 작업, 스크립트 실행에 적합 (예: 로그 정리, 백업).
Celery + Django/Flask: 웹 애플리케이션의 주기적 작업 및 비동기 작업 관리. 복잡한 데이터 파이프라인 처리에 적합.
MariaDB Event Scheduler: 데이터베이스 내부 관리 작업 자동화 (예: 주기적 테이블 정리, 통계 기록).
내생각
위 내용을 보니까 crontab으로 가야 하나를 고려 해야할 것 같습니다. 왜냐면, Celery는 시스템에서 사용을 못할 것 같습니다. 왜냐면 메모리가 얼마 안되는데 Redis나 RabbitMQ를 설치해서 사용해야 하네요.
MariaDB Event Scheduler는 저희가 데이터베이스를 MySQL을 사용하기 때문에 안될 것 같습니다. 그리고 얘는 DB관련 스크립트에 좀 더 강한 특성을 보이고 있습니다.
crontab을 사용하거나, python으로 코딩을 하거나 해야 되네요.
내가 생각하는 스케쥴러의 방향
가벼워야 한다.
리눅스 서버가 리붓되어도 실행 되어야 한다.
Thread를 지원해서 정확한 시간에 실행 되어야 한다.
위 세가지 조건을 만족 하려면, 내가 짜야할 것 같습니다.
일단 작업하면서 한번 작성해보겠습니다.
지금은 계속 프로그램 상에서 스케쥴을 관리하고,
제가 생각하는 스케쥴러를 짜서 팔아 봐야 겠습니다.
감사합니다.
Posted through the ECblog app (https://blog.etain.club)
Upvoted! Thank you for supporting witness @jswit.