목적
- msvc(마이크로 서비스) 구축을 위한 Flower, Celery, RabbitMQ 연동 원리 이해하기
기능별 역할
- Flower
- 모니터링 툴 => 실행 결과 같은걸 볼 수 있음
- RabbitMQ
- Celery
- RabbitMQ를 바라보고있다가 ⇒ RabbitMQ에 task가 들어오면 그걸 가져와서 task를 수행
- celery worker가 여러개이니깐 비동기 작업이 가능한건가??
실습환경
- local에서 rabbitmq, celery 세팅하였고
- flower는 docker로 띄우고 celery와 연결함
- rabbitmq, celery, flower는 docker로 local에서 접속할 수 있는 상태로 띄우고 실습하였음
Local 실습과정
$ brew update
$ brew install rabbitmq
$ pip install celery
$ pip install flower
$ rabbitmq-server
$ rabbitmqctl stop
$ rabbitmqctl add_user scene scene123
$ rabbitmqctl add_vhost scene_vhost
$ rabbitmqctl set_user_tags scene scene_tag
$ rabbitmqctl set_permissions -p scene_vhost scene ".*" ".*" ".*"
$ celery -A test_celery worker --loglevel=info
$ celery -A test_celery flower
$ python -m test_celery.run_tasks
Docker 실습 과정
- docker mypy에서 celery설치
- python docker image pull & run
docker pull python
docker run -it --name mypy python /bin/bash
- python docker 컨테이너에 접속해서
pip install celery redis
실행
- 아래 mypy 컨테이너에 있어야 할 .py 파일들 생성한 후
- celery 실행 =>
celery -A test_celery worker --loglevel=info
- docker rabbitmq 컨테이너 띄우기
docker pull rabbitmq
docker run -d -p 5672:5672 --name rabbitmq rabbitmq
- 위 command까지 실행하면 local에서
rabbitmq-server
명령어로 띄운거나 마찬가지로 생각
- 따라서, rabbitmq 컨테이너에 들어가서 add_host, add_vhost, set_user_tags, set_permissions 작업해주기
- docker flower 컨테이너 띄우기
- 아래 Dockerfile로 build 해준다
docker build -t [하고싶은image이름] .
docker build -t flower_scene .
docker run -p 5555:5555 --name flower_scene flower_scene
- 위의 docker run 실행 후
- mypy 컨테이너에서
python -m test_celery.run_tasks
한 후
- flower는 localhost:5555로 접속하면 테스크 실행된걸 모니터링 가능함
- docker redis 컨테이너 띄우기
docker pull redis
docker run -d -p 6379:6379 --name redis_scene redis redis-server --appendonly yes
- (참고) docker build 할 때 쓰는
Dockerfile
FROM mher/flower
EXPOSE 5555
CMD ["celery", "--broker=amqp://scene:scene123@172.17.0.4:5672/scene_vhost", "flower"]
- (참고) docker bridge network 주소 확인하는 방법
- 위의 rabbitmq, flower, redis 주소는 bridge network 주소 확인해서 입력해줌
docker network inspect bridge
mypy 컨테이너에 있어야 할 .py파일
test_celery
├── celery.py
├── run_tasks.py
└── tasks.py
from __future__ import absolute_import
from celery import Celery
app = Celery('test_celery',
broker='amqp://scene:scene123@172.17.0.4:5672/scene_vhost',
backend='redis://172.17.0.5',
include=['test_celery.tasks'])
from __future__ import absolute_import
from test_celery.celery import app
import time
@app.task
def longtime_add(x, y):
print('long time task begins')
time.sleep(5)
print('long time task finished')
return x + y
from .tasks import longtime_add
import time
if __name__ == '__main__':
result = longtime_add.delay(1,2)
print('Task finished? ', result.ready())
print('Task result: ', result.result)
time.sleep(10)
print('Task finished? ', result.ready())
print('Task result: ', result.result)
ToDo
- docker network에 대해서 잘 정리해두기
- Dockerfile에 instruction에 대해서 잘 정리해두기(참고링크)
- airflow <> Nginx <> msvc 연동도 테스트하기
- msvc 빌드툴 개발하기
References