IT Best Practise/Linux
Celery 데몬 분리 - RabbitMQ의 Queue 기반
GilliLab IT
2025. 3. 10. 10:24
728x90
반응형
Celery 데몬 분리 - RabbitMQ의 Queue 기반
- 1. 새로운 Celery 서비스 파일 생성 (
celery-order.service
&celery-goods.service
) - 2.
celery-order.service
수정 (order_queue 전용) - 3.
celery-goods.service
수정 (goods_queue 전용) - 4. 새로운 환경 파일 생성 (
celery-order
&celery-goods
) - 5. 시스템 데몬 리로드 및 서비스 실행
- 6. 서비스 상태 확인 및 로그 확인
- 최종 구성 요약
- Keywords
하나의 Default Queue를 사용하는 구조를 order_queue
와 goods_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.service
→order_queue
전용 Celery 워커celery-goods.service
→goods_queue
전용 Celery 워커- 각각 별도의 환경 설정 파일 (
/etc/default/celery-order
,/etc/default/celery-goods
) - 부팅 시 자동 시작 설정 완료 (
systemctl enable
적용) systemctl status celery-order
,systemctl status celery-goods
로 서비스 상태 확인 가능
이제 order_queue
와 goods_queue
가 각각 독립적으로 동작하며, 성능 최적화를 기대할 수 있다.
CeleryBeat 동일 구성 적용
Keywords
Celery, Daemon, Systemd, Service, Linux, Background Task, Task Queue, Asynchronous, Worker, Configuration
728x90
반응형