JustDoEat
메세지 지향 미들웨어란?(Celery, RabbitMQ 간단한 사용경험 기록) 본문
미들웨어(MiddleWare)란?
애플리케이션과 하드웨어, 혹은 소프트웨어 사이에 위치하며 이들 사이의 통신을 중재하는 역할을 하는 징검다리 역할이다.
요약하자면 징검다리 역할을 하는 친구들을 미들웨어라고 한다.
이렇게만 보니까 영 친숙하지도 않고 정도 안 붙는다;
메시지큐에 대한 회고와 설명이 주로 있을 예정이다.
미들웨어(MiddleWare)의 종류
1. 메시지 지향 미들웨어(Message-Orient-Middleware)
2. 웹 서버 미들웨어(Web-Server-Middleware)
3. 애플리케이션 서버 미들웨어(Application-Server-Middleware)
4. 엔터프라이즈 서비스 버스
꼭 위에 있는 것만이 미들웨어는 아니다
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
"corsheaders.middleware.CorsMiddleware",
'whitenoise.middleware.WhiteNoiseMiddleware',
'django_prometheus.middleware.PrometheusBeforeMiddleware',
'django_prometheus.middleware.PrometheusAfterMiddleware',
]
Django를 사용하여 프로젝트를 했을 때, Prometheus를 사용하기 위해서 미들웨어에 설정을 추가한 후 메트릭을 수집하도록 했는데.
이 또한 미들웨어이다.
메시지 지향 미들웨어(Message-Orient-Middleware)
메시지 기반의 통신을 기반으로 설계된 미들웨어이다.
RabbitMQ, 혹은 Kafka 등이 해당된다.
메시지
데이터의 단위를 의미, 이메일 시스템에서의 메시지는 우리가 아는 그 "메시지"이다.
API를 호출하는 관점에서의 메시지는, HTTP의 요청 혹은 응답, GET, POST, PUT 등의 요청이 있을 수 있고, JSON형식으로 무언가의 데이터를 전달하는 것이 있을 수 있다.
메시지 전달방식
1. 메시지 큐(Message Queue) 방식
-> 메시지는 큐에 저장이 되고, 소비자가 소비하기 전까지 큐에 남아있다.
-> 큐, 생산자, 소비자로 구성되어 있다.
-> 하나의 메시지는 하나의 소비자가 소비할 수 있다.
2. 발행-구독 방식
-> 메시지는 토픽으로 생성이 된다.
-> 이를 구독하는 모든 소비자가 메시지를 받을 수 있다.
->각 메시지는 여러 소비자가 받을 수 있다.
3. 그 외
-라우팅 모델(라우팅 키를 기반으로 라우팅 키가 일치하면 해당하는 큐로 보내줌, 로그처리기에서 로그 분리에 이용!)
-브로드캐스트 모델(모든 소비자에게 메시지 전달)
-피어 투 피어 모델(중앙 브로커 없이, 직접적인 메시지 전달, P2P사이트에서 이용)
메시지 큐 + RabbitMQ 같은 중재자 == Middleware를 사용하는 이유는
1. 비동기적으로 메시지를 전달하며 순서를 보장함.
2. 분산된 환경에서 동시다발적으로 메시지요청을 보낼 시 이 또한 순서를 보장해 줌.
3. 작업 간의 의존성을 낮추어 준다.(메시지가 전달이 되면 큐에 저장이 되어있고 이 작업이 즉시 처리가 되지 않아도 되기 때문)
4. 중간다리 역할을 해줌.
+회고
(정처기 준비하면서 나와서 예전에 사용경험을 간단하게 적어보았다. RabbitMQ, Celery에 대한 깊이 있는 설명이 아니다!!)
출처: https://velog.io/@sdb016/RabbitMQ-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90
RabbitMQ를 사용했던 이유는 Django는 싱글스레드로 비동기 작업을 지원하지 않아 비동기 처리를 위해
Celery(메세지큐)+RabbitMQ(중개인) = Message Middleware를 사용하여 비동기 처리를 가능하도록 만들었다.
위에서 기설명 한 비동기적으로 메시지를 처리하고, 분산된 환경은 아니지만 동시다발적으로 요청이 들어왔을 때 순서를 보장해 주었다.
Celery, RabbitMQ 둘 다 메시지 큐의 역할을 하지만, 주로 Celery를 큐로 활용하고 RabbtMQ를 메시지 중개인으로 이용을 한다.
정보처리기사 준비를 하면서 내가 경험했던 기술들이 메시지 지향 미들웨어였다는 것을 다시 한번 상기할 수 있었다.
'Study > 정보처리기사' 카테고리의 다른 글
UML 다이어그램이란 무엇인지 알아보자 (1) | 2024.06.18 |
---|