Flower <> Celery <> RabbitMQ <> Redis 연동 실습

oneofakindscene·2021년 7월 18일
1

msvc

목록 보기
1/1

목적

  • msvc(마이크로 서비스) 구축을 위한 Flower, Celery, RabbitMQ 연동 원리 이해하기

기능별 역할

  • Flower
    • 모니터링 툴 => 실행 결과 같은걸 볼 수 있음
  • RabbitMQ
    • flower에서 task를 받음
  • Celery
    - RabbitMQ를 바라보고있다가 ⇒ RabbitMQ에 task가 들어오면 그걸 가져와서 task를 수행
    • celery worker가 여러개이니깐 비동기 작업이 가능한건가??

실습환경

  • local에서 rabbitmq, celery 세팅하였고
  • flower는 docker로 띄우고 celery와 연결함
    - rabbitmq, celery, flower는 docker로 local에서 접속할 수 있는 상태로 띄우고 실습하였음

Local 실습과정

# rabbitmq 설치
$ brew update
$ brew install rabbitmq

# celery, flower 설치
$ pip install celery
$ pip install flower

# rabbitmq-server 실행시
$ rabbitmq-server
# (참고) rabbitmq-server 종료시
  # 종료하더라도 등록한 add_user, add_vhost 등은 살아있음
$ rabbitmqctl stop

# 위 command 실행 후 아래 command 실행해야함
$ rabbitmqctl add_user scene scene123
$ rabbitmqctl add_vhost scene_vhost
$ rabbitmqctl set_user_tags scene scene_tag
$ rabbitmqctl set_permissions -p scene_vhost scene ".*" ".*" ".*"

# worker on
$ celery -A test_celery worker --loglevel=info 

# celery <> flower
$ celery -A test_celery flower

# task 실행
$ 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
# Dockerfile 내용
FROM mher/flower
EXPOSE 5555
CMD ["celery", "--broker=amqp://scene:scene123@172.17.0.4:5672/scene_vhost", "flower"]
# broker 형태
# broker='amqp://[user]:[pw]@localhost/[vhost]',
  • (참고) docker bridge network 주소 확인하는 방법
    • 위의 rabbitmq, flower, redis 주소는 bridge network 주소 확인해서 입력해줌
    • docker network inspect bridge

mypy 컨테이너에 있어야 할 .py파일

  • 디렉토리 계층
test_celery
├── celery.py
├── run_tasks.py
└── tasks.py
  • celery.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'])
# broker 형태
# broker='amqp://[user]:[pw]@localhost/[vhost]',
  • 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')
    # sleep 5 seconds
    time.sleep(5)
    print('long time task finished')
    return x + y
  • run_tasks.py
from .tasks import longtime_add
import time

if __name__ == '__main__':
    result = longtime_add.delay(1,2)
    # 이 지점에서 작업이 완료되지 않으므로 False를 반환합니다.
    print('Task finished? ', result.ready())
    print('Task result: ', result.result)
    # 10초 후 작업이 완료됩니다.
    time.sleep(10)
    # 이 지점에서 작업이 완료되고 ready()가 True를 반환합니다.
    print('Task finished? ', result.ready())
    print('Task result: ', result.result)

ToDo

  • docker network에 대해서 잘 정리해두기
  • Dockerfile에 instruction에 대해서 잘 정리해두기(참고링크)
  • airflow <> Nginx <> msvc 연동도 테스트하기
  • msvc 빌드툴 개발하기

References

profile
oneofakindscene

0개의 댓글