2019. 7. 21. 16:45 Network

RabbitMQ에 대해서

반응형

참고 출처 : https://skibis.tistory.com/310

 

RabbitMQ란 AMQP을 기반으로 만들어진 프로그램이다.

 

RabbitMQ와 관련된 주요 용어는 아래와 같다.

 

producer : 메세지를 보내는 App

publish : Producer가 메세지를 보내는 것

Queue : 메세지를 저장하는 버퍼, Queue는 Exchange에 Binding 된다.

Consumer : 메세지를 수신하는 App

 - 동일 업무를 처리하는 Consumer는 보통 한개의 Queue를 본다.

 - 여러 Consumer가 같은 Queue를 볼 때 자동으로 메세지가 분배되서 전달된다.

Subscribe : Consumer가 메세지를 수신하기 위해 Queue를 실시간 리스닝 하도록 한다.

Exchange : Producer가 전달한 메세지를 Queue에 전달하는 역할을 한다.

 - 메세지가 Queue에 직접 전달되지 않고 exchange type에 정의한 대로 동작한다. 

ExchangeType : type에는 fanout, direct, topic, header 4가지가 존재한다.

Binding : Exchange와 Queue를 연결해주는 작업

Routing : Exchange와 Queue에 메세지를 전달하는 과정을 의미한다.

RoutingKey : Exchange와 Queue가 binding 될 때 Exchange가 Queue에 메세지를 전달할지 여부를 결정한다.

 

 

Exchange를 별도로 명시하지 않은 경우, RabbitMQ의 기본적인 흐름은 아래와 같다.

1. Producer가 메세지를 생성하여 전송.

2. Queue가 이 메세지들을 순차적으로 쌓는다.

3. Consumer가 Queue에 대한 Biunding을 가지고 있다가 메세지를 Queue에서 수신한다.

 

 

메세지의 분배 [ Round - robin Dispatching ]

RabbitMq는 Consumer가 병렬처리를 쉽게 할 수 있도록  같은 Queue를 바라보고 있는 Consumer에게 균등 분배한다.

즉, 첫 메세지는 Consumer1, 두번째 메세지는 Consumer2에게 주는 식으로 중복처리되지 않게 자동 분배를 해준다.

 - 이 특징을 통해서 RabbitMQ는 수평적 확장이 용이하다.

 

공평한 분배 [ Fair dispatch ]

여러 consumer에게 round robin을 통해 메세지를 균등하게 전달하지만 완전한 균등은 아니다.

이 때 Busy한 서버에게 메세지가 계속 전달되지 않도록 prefetchCountㄹ하는 개념을 사용한다.

prefetchCount가 1일 때는 아직 sck를 받지목한 메세지가 1개라도 존재 시,

해당 Consumer에게 메세지를 할당하지 않는다.

[prefetchCount는 해당 Consumer의 동시 처리가능한 메세지 갯수를 의미하는 듯]

 

메세지 수신 통보 [ Acknowledgement ]

많은 프로토콜이 메세지 전달 보장을 위해서 Acnowledgement( ACK ) 라는 개념을 사용해서

메세지에 대한 응답을 보내주도록 되어 있다.

ACK의 중요성은 메세지가 확실히 처리되었는지를 확인할 수 있게 해주며 ACK가 온 메세지에 한해서만

Queue에서 삭제를 진행하기 때문이다.

 

 

Consumer 중 일부가 죽었을 시 대응방법

ACK가 오지 않는 Consumer가 존재 시(Disconnect등의 경우) 해당 메세지를 다음 Consumer에게 할당한다.

 

 

RabbitMQ가 죽었을 경우 대응 방법

RabbitMQ는 Queue에 메세지를 보관하고 ACK를 받은 경우에만 메세지를 Queue에서 삭제한다.

Consumer가 죽었을 시 메세지를 보존할 수 있지만 RabbitMQ가 죽은 경우는 어떻게 해야할까

RabbitMQ가 죽는다면 Queue에 있는 메세지들 역시 날아가 버릴 것이다.

이 경우에 대한 대비책은 메세지들을 Queue에 저장 시 File에도 기록하는 것이다.

 

반응형

'Network' 카테고리의 다른 글

HTTP Protocol  (0) 2021.06.20
OSI 7계층과 TCP/IP 4 계층  (0) 2021.06.20
load balancing  (0) 2020.08.27
OSI 7계층와 TCP/IP 4 계층  (0) 2020.08.27
Thrift에 대해서 [C# 한정]  (0) 2020.01.10
Posted by Sweetmeats_boy

블로그 이미지
Sweetmeats_boy

태그목록

Yesterday
Today
Total

달력

 « |  » 2024.9
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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함