개발이야기 012. talkit.bank 스케쥴러 선택을 위한 고려

in #talkit8 days ago

이미지 설명

어제 말씀 드린 세가지 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());


비교 요약

기능crontabCelery + Django/FlaskMariaDB 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)

Sort:  

Upvoted! Thank you for supporting witness @jswit.

Coin Marketplace

STEEM 0.17
TRX 0.24
JST 0.034
BTC 96428.85
ETH 2753.27
SBD 0.65