티스토리 뷰

RabbitMQ

RabbitMQ의 Connection과 Channel

DevHyo 2021. 9. 23. 19:06

사내에서 진행되는 서비스를 개편하게 되면서, RabbitMQ를 사용하게 되었습니다. RabbitMQ을 사용하고, 운영하면서 Connection과 Channel에 대한 개념이 잡히지 않아서 정리하게 되었습니다.

 

Connection

일반적인 특징

 

  • RabbitMQ에서 지원하는 모든 프로토콜은 TCP 기반이다.
  • 효율성을 위해 긴 연결을 가정한다. (프로토콜 작업당 새 연결이 열리지 않음.)
  • 하나의 클라이언트 연결은 단일 TCP 연결을 사용한다.
  • 클라이언트가 연결을 성공하려면, RabbitMQ 대상 노드는 특정 프로토콜에 대한 연결을 허용해야 한다.
  • 연결은 오래 지속되어야 하기 때문에 일반적으로 구독을 등록하고, 폴링 대신에 메시지를 전달하여 소비한다.
  • 연결이 더 이상 필요하지 않은 경우, 리소스 절약을 위해 연결을 닫아야 한다. 이를 수행하지 못하는 클라이언트는 리소스의 대상 노드를 고갈시킬 위험이 있다.
  • 운영 체제는 단일 프로세스가 동시에 열 수 있는 TCP 연결(소켓) 수에 대한 제한이 있다. QA 환경에서는 충분한 경우가 있지만, Production 환경에서는 더 높은 제한을 사용하도록 구성해야 할 수도 있다.
AMQP 0-9-1 버전의 프로토콜을 사용하고 있는 Connection의 특징

 

  • 단일 TCP 연결을 통해 다중화 연결 방법을 제공한다.
  • 단일 연결에 대한 채널을 통해 여려 경량 연결을 열 수 있다.
  • 즉, AMQP 0-9-1 버전의 프로토콜을 사용하고 있는 클라이언트는 단일 TCP 연결 후, 하나 이상의 채널에서 메시지 전달, 소비, 관리 작업을 수행할 수 있다.

Connection Life Cycle

일반적인 Life Cycle

 

  • 클라이언트는 라이브러리를 사용해서 Host와 Port 정보를 통해 연결 정보를 구성한다.
  • 라이브러리는 HostName을 하나 이상의 IP Address로 확인한다.
  • 라이브러리는 대상 IP Address 및 Port에 대한 TCP 연결을 연다.
  • 서버가 TCP 연결을 수락한 후 프로토콜별 협상 절차가 수행된다.
  • 그런 다음 서버는 클라이언트를 인증한다.
  • 클라이언트는 이제 작업을 수행할 수 있으며, 각 작업에는 서버의 권한 부여 확인이 포함된다.
AMQP 0-9-1 프로토콜의 세부적인 Life Cycle

 

  • 연결 및 채널이 포함된 모델이 있고, 채널은 연결 멀티플렉싱을 허용한다. (TCP 연결에 여러 논리적 연결을 가짐.)
  • 연결에서 동시에 열 수 있는 최대 채널 수는 연결 시, 클라이언트와 서버가 협상한다.
  • 클라이언트는 서버에서 구성한 최댓값보다 많은 채널을 허용하도록 구성할 수 없다.
  • 성공적으로 연결을 열고 인증한 후, 응용 프로그램은 하나 이상의 채널을 열고, 이를 사용하여 프로토콜 작업을 수행한다.

 

Channel

AMQP 0-9-1 버전의 프로토콜을 사용해야 채널을 사용할 수 있습니다. 보통 RabbitMQ는 AMQP 0-9-1 버전의 프로토콜을 기본적으로 지원하기 때문에 그대로 사용하실 수 있습니다.

Channel의 간략한 특징

 

  • 단일 TCP 연결을 공유하는 논리적인 개념의 경량 연결로 다중화된다.
  • 클라이언트가 수행하는 모든 프로토콜 작업은 채널에서 발생한다.
  • 채널 안에 연결할 Queue를 선언할 수 있으며, 채널 하나당 하나의 Queue만 선언이 가능하다.
  • 특정 채널의 통신은 다른 채널의 통신과 완전히 분리되어 있기 때문에 프로토콜은 채널 ID와 같은 식별자를 포함시켜 전달한다.
  • 채널 ID를 통해 클라이언트나 브로커 모두 채널에 대한 파악이 가능하다.
  • 채널은 Connection Context에만 존재하기 때문에 Connection이 닫히면, 연결된 모든 채널도 닫힌다.
  • 클라이언트에서 처리를 위해 멀티 프로세스/스레드를 사용한다면, 프로세스/스레드 별로 새 채널을 열고 공유하지 않는 것이 일반적이다.

Channel Life Cycle

Open

 

  • 클라이언트는 연결을 성공적으로 연 후, 채널을 연다.
  • 새 채널을 열게 되면, 자동으로 채널 ID가 할당된다.
  • Connection과 마찬가지로 채널은 지속적으로 열린 상태여야 한다.
  • 작업마다 채널을 여는 작업은 네트워크 왕복의 비용이 들기 때문에 매우 비효율적이다.
Close

 

  • 채널이 더 이상 필요하지 않으면 닫아야 한다.
  • 채널을 닫으면 채널을 사용할 수 없게 되고, 해당 리소스를 회수하도록 예약하는 방식으로 처리된다.

 

Connection과 Channel 간의 관계를 정리해본다면?

  • Connection은 물리적인 연결이다.
  • Connection은 단일 TCP 연결만 가능하다.
  • AMQP 0-9-1 버전의 프로토콜을 사용하는 Connection의 경우, Channel이라는 경량 연결을 포함하고 있다.
  • Channel은 Connection Context를 공유하며, 하나 이상의 경량 연결이 가능하다.
  • Channel 하나당 하나의 Queue만 연결이 가능하다.

 

참고

 

Connections — RabbitMQ

Connections This guide covers various topics related to connections except for network tuning or most networking-related topics. Those are covered by the Networking and Troubleshooting Networking guides. Channels is a closely related concept in AMQP 0-9-1

www.rabbitmq.com

 

Channels — RabbitMQ

Channels This guide covers various topics related to channels, an AMQP 0-9-1-specific abstraction. Channels cannot exist without a connection, so getting familiar with the Connections guide first is highly recommended. This guide covers: and other topics r

www.rabbitmq.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
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
글 보관함