yoncho`s blog

[RabbitMQ] 3. Connection & Channel 본문

기술, 나의 공부를 공유합니다./MQTT

[RabbitMQ] 3. Connection & Channel

욘초 2023. 6. 24. 12:26

Consumer Application에서 Broker로 많은 Connection (TCP 연결)을 맺는 것은 좋지 않다.
RabbitMQ에서는 Channel 이라는 개념을 통해 하나의 TCP 연결을 공유해서 사용할 수 있는 기능을 제공한다.
단, 멀티 스레드 혹은 멀티 프로세스 사용하는 작업은 각각 별도의 Channel을 열어 사용하는게 좋다.

 

 

Connection

간략 설명 :
Client (Pub/Sub)은 RabbitMQ(Host)와 단일 TCP 연결을 함.
이걸 Connection이라고 부름.

- Feature
Client(Pub/Sub)과 RabbitMQ가 연결될 때, 정확히는 RabbitMQ에서 지원하는 프로토콜은 모두 TCP 기반이다.

 

일반적인 Connection 특징 AMQP 0-9-1 Connection 특징
하나의 Client 연결은 단일 TCP 연결을 한다.
연결을 오래 지속함.
연결을 오래 지속하기 위해 구독 등록, 메시지 Pub/Sub이 이뤄짐.
연결이 더 이상 필요 없을 시 리소스 낭비를 막고자 Close action을 취해야함.
단일 TCP 연결을 통해 다중화 연결 방법 제공(*Channel)
단일 연결에서 Channel을 통해 여러 경량 연결을 할 수 있음.
AMQP 0-9-1 버전 프로토콜 사용 Client는 단일 TCP 연결 후 하나 이상의 Channel을 통해 메시지 Pub/Sub/Management 가


- Life Cycle

일반적인 Connection Life Cycle AMQP 0-9-1 Connection Life Cycle
  1. Client는 RabbitMQ Library를 이용해 Host와 Port 정보 등으로 연결 정보를 구성
  2. Library는 HostName을 하나 이상의 IP Address로 확인
  3. Library는 대상 IP Address 및 Port에 대한 TCP Connection을 진행
  4. Server가 Client의 연결을 승인 후 프로토콜 별 Connect 절차 수행
  5. Server는 Client 인증함.
  6. Server로 부터 인증된 Client는 Pub/Sub 작업 수행 가능
  1. Connection과 Channel이 포함된 Model이 존재, 연결 멀티플렉싱 허용 (TCP 연결에 여러 논리 연결 가짐)
  2. Connection 시 동시에 열 수 있는 최대 Channel 수는 Client와 Server가 Connect하면서 결정
  3. Client는 Server에서 구성한 Channel 수 최대값을 넘게 Channel을 열 수 없음
  4. 성공적으로 Connection을 열고 Client 인증 후, 작업은 하나 이상의 채널을 열고 이를 사용해 작업을 수행

 

Channel

간략 설명 :
Client가 Broker와 성공적으로 Connection 했으면 Channel을 통해 Client 작업을 진행함.
여기서 Connection은 단일 연결인 반면 Channel은 여러 논리 연결이 가능함.
*CAN BUS가 Message Bus 형태인 것 처럼 RabbitMQ 또한 Message Bus 형태이므로 유사하게 생각하면 됨.

- Feature

AMQP 0-9-1 버전 프로토콜에서 Connection을 사용해야 Channel을 사용할 수 있음.
보통 RabbitMQ는 AMQP 0-9-1 버전 프로토콜을 지원하기 때문에 별 문제 없이 사용할 수 있음.

 

Channel 특징
단일 TCP 연결을 공유해 다중 경량 연결함.
Client가 수행하는 모든 프로토콜 작업은 Channel에서 발생.
Channel 안에서 연결할 Queue 선언 및 Channel 하나당 하나의 Queue만 선언이 가능
Channel들은 서로 분리되어있기 때문에 각 Channel 별 고유 식별 ID를 포함해 Broker에게 전달함.
고유식별 ID를 통해 Client, Broker 모두 해당 ID의 Channel을 파악할 수 있음.
Channel은 Connection Context에 존재하기에 Connection이 닫히면 Channel들 또한 닫힌다.
Client에서 멀티 스레드/프로세스를 사용해야 한다면 스레드/프로세스 별로 Channel을 열고 사용하는게 일반적이며 이때 Channel간 공유는 이뤄지지않는다.


- Life Cycle

Channel Life Cycle
Open
  1. Client가 Broker와 Connection을 성공적으로 한 후, Channel을 Open함.
  2. Channel Open시 자동으로 Channel은 고유 식별 ID를 부여받음.
  3. Connection과 마찬가지로 Channel은 지속적으로 Open된 상태여야함.
  4. 작업마다 Channel을 여는건 비효율적임.
Close
  1. Channel이 더 이상 필요 없을시 Close 해야함. (불필요한 리소스 방지)
  2. Channel Close 시 해당 Channel은 더 이상 사용할 수 없으며 리소스 회수함.

 

Connection과 Channel 관계


- Connection은 물리적 연결
- Connection은 단일 TCP 연결만 가능
- AMQP 0-9-1 버전 프로토콜 사용하는 Connection의 경우 Channel이라는 경량 연결 포함
- Channel은 Connection Context 공유, 하나 이상의 경량 연결 가능
- Channel 하나당 하나의 Queue만 연결 가능
- Connection 닫힐 시 Connection 안에 정의된 모든 Channel도 같이 닫힘

 

Sample Code

//추후 작업 예정

 

참고 :
https://hyos-dev-log.tistory.com/8
https://www.rabbitmq.com/connections.html
https://www.rabbitmq.com/channels.html
https://sharmilas.medium.com/get-started-with-rabbitmq-in-node-js-1adb18d019d0

'기술, 나의 공부를 공유합니다. > MQTT' 카테고리의 다른 글

[RabbitMQ] 5. RabbitMQ Broker ShutDown 대비  (0) 2023.06.24
[RabbitMQ] 4. Clustering & Mirroring  (0) 2023.06.24
[RabbitMQ] 2. Queue  (0) 2023.06.24
[RabbitMQ] 1. Exchange  (0) 2023.06.24
[RabbitMQ] 0. RabbitMQ ?  (0) 2023.06.22
Comments