메시지 패턴

teal·2025년 3월 13일
0

Django

목록 보기
4/5

Django로 백엔드 개발을 하다보면 어느순간 celery, redis 등을 사용해서 비동기 처리 등을 하곤한다. redis 뿐만아니라 RabbitMQ, Kafka을 쓰기도한다. 그러면 우리가 자주 사용하는 celery, redis 는 무엇이고 비동기 처리하는 방식을 뭐라고 부르는 것일까?

Celery

Celery는 파이썬에서 비동기 태스크를 분산 처리하기 위한 태스크 큐 프레임워크로 worker 프로세스를 통해 트래픽 증가시 손십게 스케일 아웃이 가능하다. @shared_task를 통해 비동기 태스크로 선언 후 .delay() 등의 함수로 실행할 수 있다. 내부에서 메시지 큐를 이용하여 작업을 큐에 저장하고 해당 작업을 worker들이 처리할 수 있게 하며 보통 메시지 큐로 Redis, RabbitMQ등을 사용한다.

https://github.com/celery/celery

Redis(Remote Dictionary Server)

레디스는 인메모리 기반의 key-value 저장소로 캐싱, 메시징 등 다양한 기능을 지원하는 NoSQL 데이터베이스이다. 데이터에 대한 빠른 액세스를 제공하므로 캐싱 및 세션 스토리지로 많이 쓰인다. Pub/Sub 메시지 패턴을 기본적으로 지원하므로 실시간 혹은 이벤트 기반 아키텍처에서 자주 사용된다. celery와 함께 쓰이는 경우 메시지 브로커, 메시지 큐로 사용된다.

https://aws.amazon.com/ko/compare/the-difference-between-redis-and-mongodb/

Message pattern

우리가 평소에 사용하던 celery의 delay를 이용하던 비동기 처리가 있다. 이건 메시지 패턴에서 Point-to-Point라고 부른다. Point-to-Point를 비롯하여 다른 메시지 패턴은 어떤게 있고 어느 경우에 사용할까?

Point-to-Point

Point-to-Point 패턴은 Producer가 메시지 큐에 메시지를 넣으면 여러 Consumer중 하나의 Consumer가 메시지를 가져가는 방식이다. 이를 이용하여 celery의 delay를 이용하여 비동기 처리시 task를 여러 worker 중 하나가 가져가서 처리한다.

pub/sub

Django에 Channels를 이용하여 ASGI에서의 비동기 기능을 쉽게 사용할 수 있게 하고 여기서 redis의 특정 채널을 구독하면 된다. 그리고 해당 채널로 퍼블리싱할 시 Django가 그에 따른 동작을 할 수 있다. 그래서 Channels + redis + ASGI(uvicorn 등)의 조합 등으로 사용된다.
ex) django에서 사용자의 요청에 따라 작업을 비동기 celery 작업으로 넘기고 완료 시 해당 task에서 특정 채널로 퍼블리싱하고 해당 메시지를 수신하여 웹소켓을 통해 유저에게 완료 메시지를 전달할 수 있다.

Request/Response

이 패턴은 Django, Celery, Redis 구조에서 Django에서 비동기로 task를 생성하는것이 Reqeust가 되고 이를 worker가 처리하고 Result Backend에 저장하면 요청한 측에서 필요한시기에 해당 task 결과를 가져와서 사용하는 구조이다.

큐 분리

정확히 말해 메시지 패턴은 아니나 느린 task와 빠른 task가 공존할 경우 느린 task들이 우선적으로 queue에 진입해 있는 경우 해당 task들을 처리하는데 시간이 오래걸리고 빠른 task가 그만큼 딜레이 되는 현상이 존재한다. 이를 해결하는 방법으로 특정 task가 특정 queue에 들어가게 할 수 있고 이를 통해 느린 task가 존재한다 하더라도 빠른 task가 딜레이없이 처리하는 것도 가능하다. 혹은 속도 뿐만아니라 토픽에 따라 분류할 수도 있다.

profile
고양이를 키우는 백엔드 개발자

0개의 댓글