[Django]Docker-compose로 Django 환경 구축하기 4 - RabbitMQ

2021. 6. 6. 17:48·SW개발/Django

AMQP - RabbitMQ

오늘날 개발자들은 MSA를 사용하여 애플리케이션을 구축하는 일이 당연하게 여겨지고 있다. MSA를 사용함에 따라 서버들은 아주 작은 기능을 하는 1개의 서버로서 동작을 하는데 분할된 서버들은 데이터를 어떻게 주고 받아야 할까? 두 가지의 방법이 떠오를 수 있다.

  1. 다이렉트로 데이터를 주고 받음
  2. 메시지 큐를 활용하여 데이터를 주고 받음

당연히 다이렉트로 주고 받는 것이 가장 기본이 될 것이다. 하지만 이 경우에 데이터가 적재된 곳의 서버가 부하를 버티지 못하고 서비스가 다운되버린다면? 서비스는 정상적으로 동작을 할 수 없는 상태가 된다. 이렇듯 다이렉트로 주고 받을 경우 최악의 경우는 서비스를 제대로 이용할 수 없는 상태가 되어버리는 것이다.

 

이 때 AMQP 프로토콜을 이용한 메시지 큐중 하나인 RabbitMQ를 이용할 수 있다. 데이터를 주고 받는 과정을 모두 큐에서 이루어지게 하는 것이다. 이렇게 하면 데이터의 전송량이 많아 부하가 일어나더라도 다운되는 것은 큐일 뿐이므로 서비스는 정상적으로 이용할 수 있는 상태를 유지할 수 있다.

 

이번 포스팅에서는 메시지 큐인 RabiitMQ를 Django 프로젝트에 붙여 Dockerizing 하는 방법에 대해서 다뤄보려고 한다.

마찬가지로 docker-compose.yml에 내용을 추가하면서 시작해보자.

 

docker-compose.yml 추가
# yml 파일 포맷의 version 설정
version: "3"

# docker-compose 볼륨 정의 (이 볼륨은 도커가 관리함)
volumes:
  postgres_db_dev: {}

# 띄울 컨테이너 목록
services:
  # Database container, 추후에 설명
  postgres:
    container_name : postgres_service
    # dockerhub의 postgres9.5 이미지 사용
    image: postgres:9.5
    # postgres_db_dev를 컨테이너 ~/data에 마운트
    volumes:
      - postgres_db_dev:/var/lib/postgresql/data
    # postgres 환경 변수
    environment: 
      - POSTGRES_DB=leffedb
      - POSTGRES_USER=leffe
      - POSTGRES_PASSWORD=leffe
      - POSTGRES_INITDB_ARGS=--encoding=UTF-8\

  # Django container
  django:
    # 컨테이너 명
    container_name : django_service
    # docker build 옵션
    build:
      # docker build 명령어를 실행할 디렉토리 경로
      context: .
      # 지정할 Dockerfile 경로
      dockerfile: ./Dockerfile
    # 환경 변수 설정  
    environment: 
      - POSTGRES_DB=leffedb
      - POSTGRES_USER=leffe
      - POSTGRES_PASSWORD=leffe
      - POSTGRES_HOST=postgres
      - POSTGRES_PORT=5432
      - RABBITMQ_USER=guest
      - RABBITMQ_PASSWORD=guest
      - RABBITMQ_HOST=rabbitmq
    # 현재 디렉토리를 컨테이너 내의 /home/에 mount
    volumes: 
      - ./:/home/
    # 작업 폴더 지정
    working_dir : /home/
    # 실행할 명령어
    command: > 
      bash -c "
      chmod +x /wait-for-it.sh
      && /wait-for-it.sh postgres:5432 -t 10
      && python3 manage.py migrate
      && python3 manage.py runserver"
    # 호스트 OS와 컨테이너의 포트를 바인딩
    ports: 
      - "8000:8000"
    # 호스트 OS에 포트를 공개하지 않고 컨테이너만 포트를 공개 (현재는 주석)
    #expose : 
    #  - "8000"
    # 컨테이너를 실행하는 종속성을 정의
    depends_on:
      - redis
      - rabbitmq
    
  # Redis
  redis:
    container_name: redis_service
    image: redis
    ports:
      - "6379:6379"
      
  # RabbitMQ
  rabbitmq:
    container_name: rabbitmq_service
    image: rabbitmq:3.7.14-management-alpine # 웹 UI management 툴 포함
    # 환경변수 설정
    environment: 
      - RABBITMQ_USER=guest
      - RABBITMQ_PASSWORD=guest
    ports:
      - "5672:5672" # rabbitMQ default port
      - "15672:15672" # UI를 위한 port

RabbitMQ에는 웹 상에서 UI로 관리하는 툴이 존재한다. 이 툴을 포함한 management-alpine RabbitMQ 이미지를 사용하였다.

웹 UI를 관리 툴을 위해 사용되는 15672 포트 역시 명시를 해주었다.

 

또한, django 컨테이너를 생성하기 전 redis, rabbitmq 컨테이너를 먼저 생성시키기 위해 depends_on 항목에 rabbitmq(서비스 이름)을 추가해주었다.

 

settings.py 추가
RABBITMQ_HOSTS = (os.environ.get('RABBITMQ_HOST'), )
RABBITMQ_USER = os.environ.get('RABBITMQ_USER', 'guest')
RABBITMQ_PASSWORD = os.environ.get('RABBITMQ_PASSWORD', 'guest')
RABBITMQ_QUEUE_EXPIRES = 300.0 # seconds
RABBITMQ_MESSAGE_EXPIRES = RABBITMQ_QUEUE_EXPIRES

settings.py에 다음과 같이 환경변수를 설정해 놓는다. 그리고 RabbitMQ를 브로커로 사용하는 부분에서 아래와 같이 사용한다.

메시지 broker URL 설정
broker_urls = [f'amqp://{settings.RABBITMQ_USER}:{settings.RABBITMQ_PASSWORD}@{host}//' 
		for host in settings.RABBITMQ_HOSTS]

RabbitMQ는 메시지 브로커로 사용되므로, Celery와 같은 Worker에서 사용할 때 위의 URL 주소로 접근하여 RabbitMQ 브로커를 사용할 수 있게 해준다. (이번 포스팅의 설정은 각 프로젝트의 성격마다 매우 상이할 수 있습니다)

 

위의 과정을 모두 거친 후 $ docker-compose up -d --build 명령어를 통해 빌드를 재 진행한다. 

$ docker-compose ps 명령어를 이용해 띄워진 4개의 컨테이너(django, postgres, redis, rabbitMQ)를 확인할 수 있다.

 

다음 포스팅에서는 위의 과정에 Nginx를 붙이는 방법을 알아볼 것이다.

 

공부하면서 정리한 내용이니 틀린 부분이 있을 수 있습니다. 댓글로 남겨주시면 감사하겠습니다.

 

728x90

'SW개발 > Django' 카테고리의 다른 글

[Django]Docker-compose로 Django 환경 구축하기 6 - Celery  (0) 2021.06.11
[Django]Docker-compose로 Django 환경 구축하기 5 - Nginx  (0) 2021.06.09
[Django]Docker-compose로 Django 환경 구축하기 3 - Redis  (1) 2021.06.06
[Django]Docker-compose로 Django 환경 구축하기 2 - Postgres  (0) 2021.05.31
[Django]Docker-compose로 Django 환경 구축하기 1 - Django  (0) 2021.05.27
'SW개발/Django' 카테고리의 다른 글
  • [Django]Docker-compose로 Django 환경 구축하기 6 - Celery
  • [Django]Docker-compose로 Django 환경 구축하기 5 - Nginx
  • [Django]Docker-compose로 Django 환경 구축하기 3 - Redis
  • [Django]Docker-compose로 Django 환경 구축하기 2 - Postgres
Leffe_pt
Leffe_pt
개발자로서 성장하면서 배워온 지식과 경험을 공유하는 공간입니다.
  • Leffe_pt
    Leffe's tistory
    Leffe_pt
  • 전체
    오늘
    어제
    • 분류 전체보기 (309)
      • SW개발 (305)
        • 코딩테스트 (172)
        • 개발이야기 (23)
        • IT 용어 (17)
        • Python (22)
        • Django (46)
        • Flask (2)
        • Database (3)
        • SQLAlchemy (0)
        • Javascript (5)
        • Linux, Unix (3)
        • JAVA (2)
        • Spring (10)
      • 회고 (4)
      • 사진 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    어플리케이션
    g
    오픈소스
    배달비 공유
    라이프 스타일
    배공파용
    django
    배달
    음식
    플레이스토어
    트리 #AVL #알고리즘 #자료구조
    Contributor
    컨트리뷰터
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Leffe_pt
[Django]Docker-compose로 Django 환경 구축하기 4 - RabbitMQ
상단으로

티스토리툴바