AMQP 프로토콜이 "후드에서"수행하는 작업에 대한 개념을 잘 이해하면 유용합니다. AMQP 0.9.1이 배포하기로 선택한 문서와 API가 특히 혼란스러워서 많은 사람들이 씨름해야 할 문제입니다.
TL; DR
연결 AMQP 서버와 물리적 협상 TCP 소켓입니다. 올바르게 구현 된 클라이언트는 애플리케이션별로 스레드 안전하고 스레드간에 공유 할 수있는 애플리케이션 당 하나를 갖습니다.
채널 연결에 단일 애플리케이션 세션입니다. 스레드에는 이러한 세션 중 하나 이상이 있습니다. AMQP 아키텍처 0.9.1은 스레드간에 공유되지 않아야하며 스레드를 작성한 스레드가 완료되면 닫히거나 파기되어야한다는 것입니다. 또한 다양한 프로토콜 위반이 발생할 때 서버에 의해 닫힙니다.
소비자는 특정 채널의 "메일 박스"의 존재를 나타내는 가상 구조이다. 소비자를 사용하면 브로커에게 특정 큐에서 해당 채널 끝점으로 메시지를 푸시하도록 지시합니다.
연결 사실
첫째, 다른 사람들이 올바르게 지적했듯이 연결 은 서버에 대한 실제 TCP 연결을 나타내는 객체입니다. 연결은 AMQP의 프로토콜 수준에서 지정되며 브로커와의 모든 통신은 하나 이상의 연결을 통해 이루어집니다.
- 실제 TCP 연결이므로 IP 주소와 포트 번호가 있습니다.
- 프로토콜 매개 변수는 연결 설정 ( 핸드 셰이크 라고 알려진 프로세스)의 일부로 클라이언트별로 협상됩니다 .
- 오래 지속 되도록 설계되었습니다 . 연결 클로저가 프로토콜 디자인의 일부인 경우는 거의 없습니다.
- OSI 관점에서 보면 아마도 레이어 6 주위에있을 것입니다
- TCP에는이 작업을 수행하기위한 내용이 포함되어 있지 않으므로 연결 상태를 모니터링하도록 하트 비트를 설정할 수 있습니다.
- 전용 스레드가 기본 TCP 소켓에 대한 읽기 및 쓰기를 관리하도록하는 것이 가장 좋습니다. 전부는 아니지만 대부분 RabbitMQ 클라이언트가이를 수행합니다. 이와 관련하여 일반적으로 스레드 안전합니다.
- 상대적으로 말하면, 연결은 핸드 셰이크로 인해 "비용이 많이 들지만"실제로는 중요하지 않습니다. 대부분의 프로세스에는 실제로 하나의 연결 개체 만 필요합니다. 그러나 단일 스레드 / 소켓이 제공 할 수있는 것보다 더 많은 처리량이 필요한 경우 (현재 컴퓨팅 기술과 달리) 풀에서 연결을 유지할 수 있습니다.
채널 정보
채널 RabbitMQ 브로커와 통신 할 응용 프로그램의 각 부분에 대한 열 응용 프로그램 세션입니다. 단일 연결을 통해 작동 하며 브로커와의 세션 을 나타냅니다 .
- 응용 프로그램 논리의 논리적 부분을 나타내므로 각 채널은 일반적으로 자체 스레드에 있습니다.
- 일반적으로 앱에서 연 모든 채널은 단일 연결을 공유합니다 (연결 위에서 작동하는 간단한 세션입니다). 연결은 스레드로부터 안전하므로 괜찮습니다.
- 대부분의 AMQP 작업은 채널을 통해 이루어집니다.
- OSI 레이어 관점에서 채널은 아마도 레이어 7 주위에있을 것입니다 .
- 채널은 일시적으로 설계되었습니다 . AMQP 설계의 일부는 일반적으로 오류에 대한 응답으로 채널이 닫히는 것입니다 (예 : 기존 대기열을 삭제하기 전에 다른 매개 변수로 대기열을 다시 선언).
- 일시적이기 때문에 앱에서 채널을 풀링해서는 안됩니다.
- 서버는 정수를 사용하여 채널을 식별합니다. 연결을 관리하는 스레드가 특정 채널에 대한 패킷을 수신하면이 번호를 사용하여 브로커에게 패킷이 속하는 채널 / 세션을 알려줍니다.
- 채널은 스레드간에 공유하는 것이 의미가 없으므로 일반적으로 스레드 안전하지 않습니다. 브로커를 사용해야하는 다른 스레드가있는 경우 새 채널이 필요합니다.
소비자 사실
소비자는 AMQP 프로토콜에 의해 정의 된 객체입니다. 채널이나 연결이 아니며 특정 응용 프로그램이 메시지를 삭제하기 위해 일종의 "사서함"으로 사용하는 것입니다.
- "소비자 생성"은 연결을 통해 채널 을 사용하여 브로커에게 메시지가 해당 채널을 통해 푸시되도록 알리는 것을 의미합니다. 이에 대한 응답으로 브로커는 귀하가 채널에 소비자 가 있음을 등록하고 귀하 에게 메시지를 보내기 시작합니다.
- 연결을 통해 푸시 된 각 메시지는 채널 번호 와 소비자 번호를 모두 참조합니다 . 이러한 방식으로 연결 관리 스레드 (이 경우 Java API 내)는 메시지로 수행 할 작업을 알고 있습니다. 그런 다음 채널 처리 스레드는 메시지와 함께 수행 할 작업도 알고 있습니다.
- 소비자 구현은 말 그대로 응용 프로그램마다 다르기 때문에 가장 다양한 변형이 있습니다. 구현에서 메시지가 소비자를 통해 도착할 때마다 작업을 시작하기로 결정했습니다. 따라서 연결을 관리하는 스레드, 채널을 관리하는 스레드 (및 확장으로 소비자) 및 소비자를 통해 전달 된 각 메시지에 대한 하나 이상의 작업 스레드가있었습니다.
- 닫는 연결하는 연결에 모든 채널을 닫습니다. 닫는 채널은 채널에서 모든 소비자를 닫습니다. 채널을 닫지 않고 소비자 를 취소 할 수도 있습니다 . 세 가지 중 하나를 수행하는 것이 합리적 일 때 다양한 경우가 있습니다.
- 일반적으로 AMQP 클라이언트에서 소비자를 구현하면 다른 스레드 또는 코드 활동 (게시 포함)과의 충돌을 피하기 위해 하나의 전용 채널을 소비자에게 할당합니다.
소비자 스레드 풀의 의미와 관련하여 Java 클라이언트가 클라이언트에서 프로그래밍 한 것과 비슷한 작업을 수행하고 있다고 생각합니다 (광산은 .Net 클라이언트를 기반으로했지만 크게 수정되었습니다).