Celery+Redis+Django: 비동기 처리

인턴일지

목록 보기
4/7
post-thumbnail

프로젝트 설명


Redis란?

  • 인메모리 DB로 일반 DB는 하드 디스크나 SSD에 저장을 해줘야하는 반면, RAM에 데이터를 저장
  • 데이터 조회 시, 메모리 내부에서 처리되므로 속도가 훨씬 빨라짐
  • 서비스 동시 요청 시, 다중의 사용자의 접근 안정성을 보장해주기 위함

Celery란?

  • Python에서 비동기 처리를 제공해주는 라이브러리

메세지 브로커란?

  • 서비스 간 메세지 전달을 중개
  • 서비스 간의 결합도를 낮추고, 메세지 전달의 신뢰성을 높여줌

구성 요소

  1. Producer

    • 작업을 생성하는 애플리케이션(FastAPI)
  2. Broker

    • Task를 임시로 저장하는 큐(Redis)
    • 메세지 브로커를 통해 client와 worker가 소통

      클라이언트-서버 간 메세지 전달을 위한 중간 시스템

  3. Worker

    • Task를 실행하는 프로세스
  4. Task

    • 실제 수행할 함수(비동기)
  5. Result Backend

    • 결과 저장소(Database)

models

작업 상태 구분 ex) SUCCESS, REVOKED, PROGRESS

config & app

Redis 및 celery 설정 환경 변수 관련

task⭐

  • 여기서 우리 프로젝트 task를 비동기 처리해준다.
    근데, 내부 로직에서 비동기(async def)로 구현해줬던 부분과 celery에서 비동기(task queue 기반 비동기)와 다르게 동작함.
구분설명
Celery의 비동기작업을 큐에 넣고 나중에 워커 프로세스가 비동기적으로 실행
즉, "요청과 실행의 분리"가 비동기
Python async/await이벤트 루프 기반 코루틴 비동기 실행
즉, "함수 내부에서 await을 통한 동시성 처리"
  • Celery는 별도의 프로세스에서 동작
    - 각 task == python 함수(동기 함수만)
    • multiprocessing
  • 그래서, async 함수는 이벤트 루프를 명시해줘야 celery에서 비동기 처리가 가능
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    => 여기 내부에서 우리 프로젝트 내부 함수가 돌아감

task가 완료되면, 세션 및 이벤트 종료

-> task 함수 결과는 백엔드 REDIS에 저장해줌으로써 task 완료

profile
밝은 미래 FE 개발자의 기록

0개의 댓글