일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- BIG-O NOTATION
- linux
- sftp란
- 도커컴포즈
- DynamoDB
- customize
- server
- iterm2 단축키
- minikube 설치 방법
- test
- 파이썬
- 테라폼 기본 문법
- 도커
- terraform 문법
- 컨테이너
- zsh
- Shell
- Django
- terraform
- 빅오노테이션
- docker
- python
- docker-compose
- iterm2 shortcuts
- 테라폼 문법
- zshrc
- nosql
- AWS
- minikube mac 설치
- Bash
- Today
- Total
sklass의 s-class 프로그래밍 blog
Celery 본문
Celery는 분산 메시지 전달을 기반으로 동작하는 비동기 작업 큐 (Asynchronous Task/Job Queue) 입니다. 이를 더 알아보기 위해서는 분산형 큐(Distributed Queue)에 대해서 더 살펴볼 필요가 있습니다.
분산형 큐(Distributed Queue)
분산형 큐에는 Producer(publisher: 메시지를 보내는 이) 와 Consumer(Subscriber: 메시지를 받는이) 두 에이전트가 존재합니다. 이 두 에이전트는 상호간 직접 통신하지 않으며, 서로를 인식하는 절차나 과정도 없습니다. Producer는 중앙 대기열 또는 브로커 에 메시지를 보내고, Consumer는 이 브로커로부터 관심있는 메시지를 수신합니다.
설명 | 오픈소스 | |
Message Queue | Publish-Subscribe 패턴이 메시지의 수신 및 전달 과정에 적용된 것 | Redis, RabbitMQ, Kafka, MongoDB |
Task Queue | Publish-Subscribe 패턴이 테스크의 수행 및 실행 과정에 적용된 것 (메시지 큐와 같이 구성됨) | Celery, Redis Queue, django-carrot, Taskmaster, dramatiq |
중앙 대기열이 존재하기 때문에 좋은점
1. 확장성(Scalability) - 수평확장 용이
- 특정 시스템에 대해 이용자 또는 부하(요청)의 증가에 대응할 수 있음.
- 수평 확장성 (scale out)
각 에이전트가 네트워크에서 서로를 식별할 필요 없기 때문에 수평 확장을 통한 대규모 비동기 처리가 가능합니다.
2. 느슨한 커플링(Loose Coupling)
- 중앙 대기열로 인해 느슨하게 결합된 클래스는 다른 클래스와 독립적으로 소비되고 테스트 될 수 있습니다. 이는 추가 수평 확장에 용이합니다.
Celery
Celery는 파이썬의 철학(Batteries included)이 담겨진 Task Queue 라이브러리로, 분산 메시지 전달을 기반으로하는 비동기 작업 대기열입니다. 실시간 운영에 초점을 맞추지만 스케줄링도 지원합니다.
위의 그림에서 Django는 서비스에서 발생한 각종 데이터를 DB에 전송한느 동시에 비동기로 처리해줘야 할 일들을 Background로 보냅니다. Redis가 Django에서 발생한 특정 데이터를 받아서 메모리에 저장하는데, 이때 저장되는 형태는 Key-Value 입니다. Redis는 Queue의 특성인 FIFO 방식으로 처리해야 할 작업을 Celery에 보내주고, Celery는 처리할 작업을 Queue에 쌓아둡니다. 그러면 Celery의 Worker들이 Queue에 쌓인 작업을 가져다가 처리하는 방식입니다.
Task Queue란?
Task Queue는 스레드 또는 머신에 작업을 분산시키기 위한 메커니즘으로 task라는 하나의 작업단위를 입력 받습니다. 전담 워커 프로세스는 새로운 작업을 수행하기 위해 task queue를 지속적으로 모니터링 합니다. Celery는 보통 클라이언트와 워커 사이를 중재하는 브로커를 사용하여 메시지를 통해 통신하며, task를 시작하기 위해 클라이언트는 큐에 메시지를 추가하고, 브로커는 워커에게 메시지를 전달합니다. Celery 시스템은 여러 워커와 브로커들로 구성될 수 있고, 고가용성 및 수평적 확장이 가능합니다.
'python' 카테고리의 다른 글
Python 정적 메소드 @classmethod, @staticmethod (1) | 2021.10.24 |
---|---|
shutil (0) | 2021.09.28 |
__(double underscore) (0) | 2021.08.27 |
@property (0) | 2021.08.26 |
py_src 파일 구조 (0) | 2021.08.26 |