IT Best Practise/Linux

Celery 데몬 분리 - RabbitMQ의 Queue 기반

GilliLab IT 2025. 3. 10. 10:24
728x90
반응형

Celery 데몬 분리 - RabbitMQ의 Queue 기반

하나의 Default Queue를 사용하는 구조를 order_queuegoods_queue를 처리하도록 시스템을 구성하여,
각각 서비스별 운영 독립성과 성능 확보 목적


1. 새로운 Celery 서비스 파일 생성 (celery-order.service & celery-goods.service)

1-1. 기존 celery.service를 복사하여 두 개의 서비스 파일을 생성

sudo cp /etc/systemd/system/celery.service /etc/systemd/system/celery-order.service
sudo cp /etc/systemd/system/celery.service /etc/systemd/system/celery-goods.service
sudo cp /etc/systemd/system/celerybeat.service /etc/systemd/system/celerybeat-order.service # celery-order 와 동일한 과정
sudo cp /etc/systemd/system/celerybeat.service /etc/systemd/system/celerybeat-goods.service # celery-goods 와 동일한 과정

2. celery-order.service 수정 (order_queue 전용)

sudo vi /etc/systemd/system/celery-order.service

아래와 같이 변경한다.

[Unit]
Description=Celery Order Queue Service # 수정
After=network.target

[Service]
Type=forking
User=ec2-user
Group=ec2-user
EnvironmentFile=/etc/default/celery-order # 수정
WorkingDirectory=/home/ec2-user/mmon-docker-ezyops/src/alice
ExecStart=/bin/bash -c 'source /home/ec2-user/.celery/bin/activate && ${CELERY_BIN} -A $CELERY_APP multi start $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'
ExecStop=/bin/bash -c 'source /home/ec2-user/.celery/bin/activate && ${CELERY_BIN} multi stopwait $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}"'
ExecReload=/bin/bash -c 'source /home/ec2-user/.celery/bin/activate && ${CELERY_BIN} -A $CELERY_APP multi restart $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'
Restart=always

[Install]
WantedBy=multi-user.target

3. celery-goods.service 수정 (goods_queue 전용)

sudo vi /etc/systemd/system/celery-goods.service

아래와 같이 변경한다.

[Unit]
Description=Celery Goods Queue Service # 수정
After=network.target

[Service]
Type=forking
User=ec2-user
Group=ec2-user
EnvironmentFile=/etc/default/celery-goods # 수정
WorkingDirectory=/home/ec2-user/mmon-docker-ezyops/src/alice
ExecStart=/bin/bash -c 'source /home/ec2-user/.celery/bin/activate && ${CELERY_BIN} -A $CELERY_APP multi start $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'
ExecStop=/bin/bash -c 'source /home/ec2-user/.celery/bin/activate && ${CELERY_BIN} multi stopwait $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}"'
ExecReload=/bin/bash -c 'source /home/ec2-user/.celery/bin/activate && ${CELERY_BIN} -A $CELERY_APP multi restart $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'
Restart=always

[Install]
WantedBy=multi-user.target

4. 새로운 환경 파일 생성 (celery-order & celery-goods)

4-1. celery-order 환경 파일 생성

sudo cp /etc/default/celeryd /etc/default/celery-order
sudo vi /etc/default/celery-order

아래 내용으로 수정:

CELERYD_NODES="o1 o2 o3 o4" # 수정

CELERY_BIN="/home/ec2-user/.celery/bin/celery"
CELERY_APP="worker.tasks:worker"

CELERYD_MULTI="multi"

CELERYD_OPTS="--concurrency=12 -Q order_queue --prefetch-multiplier=1" # 수정

CELERYD_MAX_TASKS_PER_CHILD=100

CELERYD_TASK_SOFT_TIME_LIMIT=None
CELERYD_TASK_TIME_LIMIT=None

CELERYD_PID_FILE="/home/ec2-user/celery/order/%n.pid" # 기존 유지로 적용함
CELERYD_LOG_FILE="/home/ec2-user/celery/order/%n%I.log" # 기존 유지로 적용함
CELERYD_LOG_LEVEL="INFO"

CELERYD_USER="ec2-user"
CELERYD_GROUP="ec2-user"

CELERY_CREATE_DIRS=1

CELERYD_ENV="+/home/ec2-user/.celery/bin/activate"
ALICE_ENV=real

4-2. celery-goods 환경 파일 생성

sudo cp /etc/default/celeryd /etc/default/celery-goods
sudo vi /etc/default/celery-goods

아래 내용으로 수정:

CELERYD_NODES="g1 g2 g3 g4" # 수정

CELERY_BIN="/home/ec2-user/.celery/bin/celery"
CELERY_APP="worker.tasks:worker"

CELERYD_MULTI="multi"

CELERYD_OPTS="--concurrency=12 -Q goods_queue --prefetch-multiplier=1" # 수정

CELERYD_MAX_TASKS_PER_CHILD=100

CELERYD_TASK_SOFT_TIME_LIMIT=None
CELERYD_TASK_TIME_LIMIT=None

CELERYD_PID_FILE="/home/ec2-user/celery/goods/%n.pid" # 기존 유지 적용
CELERYD_LOG_FILE="/home/ec2-user/celery/goods/%n%I.log" # 기존 유지 적용
CELERYD_LOG_LEVEL="INFO"

CELERYD_USER="ec2-user"
CELERYD_GROUP="ec2-user"

CELERY_CREATE_DIRS=1

CELERYD_ENV="+/home/ec2-user/.celery/bin/activate"
ALICE_ENV=real

5. 시스템 데몬 리로드 및 서비스 실행

5-1. systemd 데몬 리로드

sudo systemctl daemon-reload

5-2. 서비스 시작 및 부팅 시 자동 실행 설정

sudo systemctl enable celery-order.service
sudo systemctl start celery-order.service

sudo systemctl enable celery-goods.service
sudo systemctl start celery-goods.service

6. 서비스 상태 확인 및 로그 확인

6-1. 서비스 상태 확인

systemctl status celery-order
systemctl status celery-goods

6-2. Celery 로그 확인

tail -f /home/ec2-user/celery/order/*.log
tail -f /home/ec2-user/celery/goods/*.log

최종 구성 요약

  • celery-order.serviceorder_queue 전용 Celery 워커
  • celery-goods.servicegoods_queue 전용 Celery 워커
  • 각각 별도의 환경 설정 파일 (/etc/default/celery-order, /etc/default/celery-goods)
  • 부팅 시 자동 시작 설정 완료 (systemctl enable 적용)
  • systemctl status celery-order, systemctl status celery-goods로 서비스 상태 확인 가능

이제 order_queuegoods_queue가 각각 독립적으로 동작하며, 성능 최적화를 기대할 수 있다.

CeleryBeat 동일 구성 적용

Keywords

Celery, Daemon, Systemd, Service, Linux, Background Task, Task Queue, Asynchronous, Worker, Configuration

728x90
반응형