동시성, 병렬성 - Celery와 Message Broker

박준수·2023년 1월 2일
0

Celery란?

celery : Python 동시성 프로그래밍에서 가장 많이 사용한는 방법 중 하나이며, 분산 메시지 전달을 기반으로 동작하는 비동기 작업 큐이다.

  • 이는 Python Framework라고도 하지만 보통 Worker라고 불린다.

worker의 역할

  • Worker는 웹서비스에서 Back단의 작업을 처리하는 별도의 프레임
  • 사용자에게 즉각적인 반응을 보여줄 필요가 없는 작업들로 인해 사용자가 느끼는 Delay를 최소하 하기 위해 사용된다.
  • 웹 서비스에서 응답 시간은 서비스의 생명과 직결되므로 비동기로 작업을 처리하게 넘기고 바로 응답을 하기 위해 사용 된다.

결국 Celery는 메시지를 전달하는 역할(Publisher)과 메시지를 Message Broker에서 가져와 작업을 수행하는 Worker의 역할을 담당하게 된다.

여기서 잠깐!

동시성 프로그래밍 이란? : 논리적인 용어로 동시에 실행되는 것처럼 보이는것을 말합니다. 싱글코어에서 멀티 스레드를 동작시키기 위한 방식으로 멀티 태스킹을 위해 여러 스레드를 번갈아 가면서 실행되는 방식입니다.

병렬성 프로그래밍 이란? : 물리적으로 정확히 동시에 실행되는 것을 말합니다. 멀티 코어에서 멀티 스레드를 실행시키는 방식으로 데이터 병렬성과 작업 병렬성으로 나뉩니다.

동시성 vs 병렬성

동시성 : 은행직원 A가 윗사람과 아랫사람을 각각 처리하지만 너무 빠르게 처리하여 동시에 두사람을 처리하는 것처럼 보임

병렬성 : 은행직원 A가 윗사람 은행직원 B가 아랫사람을 각각 동시에 처리한다.

비동기 프로그래밍 이란? : 프로그램의 주 실행 흐름을 멈추어서 기다리는 부분 없이 바로 다음 작업을 실행할 수 있게 하는 방식입니다. 즉 코드의 실행 결과를 별도의 공간에 맡겨둔 뒤 결과를 기다리지 않고 다음 코드를 실행하는 병렬처리 방식입니다.
(예 : 라면은 아직 다 안익었지만 옆에서 대파를 썰고 있는 느낌?)

동기(Synchronous)

  • 현재 작업의 응답이 끝남과 동시에 다음 작업이 요청된다.
  • 함수를 호출하는 곳에서 호출되는 함수가 결과를 반환할 때까지 기다린다.
  • 작업 완료 여부를 계속해서 확인한다.

비동기(Asynchronous)

  • 현재 작업의 응답이 끝나지 않은 상태에서 다음 작업이 요청된다.
  • 함수를 호출하는 곳에서 결과를 기다리지 않고, 다른 함수(callback)에서 결과를 기다린다.
  • 작업 완료 여부를 확인하지 않는다.

비동기 큐 작업

큐 작업이 필요한 이유

  • 비동기 작업을 하면 여러가지 일을 할 수 있음
  • 동시에 대용량의 작업을 하게 되면 컴퓨팅 파워가 급감해 서비스에 방해가 될 수 있음
  • 그래서 일을 처리하기 힘든 대용량의 데이터를 큐라는 작업 공간에 임시로 보내어 대용량의 작업을 나누어 순차적(설계에 따라 각 각의 프로세스는 순차적이지 않을수도 있음)으로 처리하게 됩니다.

Celery 구조

웹 서비스(Django)에서 발생한 요청(Task)를 Message Broker에서 받아 Celery를 이용하여 분산 처리를 진행한다. Celery에서는 작업이 완료되는 (특정 이벤트)에 DB Task를 수행한다.

  • task : 비동기 큐 작업을 할 프로세스이다.
  • Message broker : 송신자의 이전 메시지 프로토콜로부터의 메시지를 수신자의 이전 메시지 프로토콜로 변환하는 중간 컴퓨터 프로그램 모듈이다.
    • queue 공간이자, Task들을 처리 및 관리하는 역할을 합니다.

      예시)
      DW : 실시간으로 데이터를 수집하고 관리하는 서버
      AS : 이 데이터를 가공하여 사용하는 서버
      메시지 브로커를 사용하면 DW에서는 수집한 데이터를 바로 메세지 큐에 Publish(적재)하고 AS는 메시지를 Subscribe(소비)하여 바로 사용하게 된다. AS에서는 별도의 조회과정이 필요없이 메세지 큐에 적재되는 메시지를 감시하고 있다가 메시지가 적재되면 바로 가져다가 사용할 수 있다.
      송신자가 보낸 메시지를 메시지 큐에 적재하고 이를 수신자가 받아서 사용하는 구조이다

  • celery worker : 유저가 다른 업무를 보는동안 보이지 않는 곳에서 task를 처리하는 착한 친구입니다.

Celery + flask + RabbitMQ 기초 실습해보기

  1. 홈브류를 통해 래빗엠큐 설치
  2. 가상환경에서 셀러리 설치
  3. 래빗엠큐 서버 실행(주의 : 래빗엠큐 먼저 켜야 샐러리 실행 가능함)
  4. 셀러리 실행
  5. 가상환경에 실행 파일(.py)넣고 파일 실행
  6. flower를 통해 결과를 웹으로 쉽게 볼 수 있음

celery -A proj flower --port=5555 flower 설치후 celery를 웹페이지로 실형결과등을 잘 보이게 함
—> 진짜 눈물난다. 에러 해결 및 실습 성공!!!!!!!!!!!!
실습해본 사이트 : celery1//celery2 둘이 짬뽕해서 함

참고 : 동시/병렬/비동기 프로그래밍//비동기 큐 작업

profile
방구석개발자

0개의 댓글