2012-05-02 5 views
51

나는 이것이 분명하다면 Rabbitmq (및 프로그래밍)의 초보자이므로 미안합니다. 대기열에서 작업하는 스레드간에 공유 할 풀을 만들고 있지만 풀에서 연결이나 채널을 사용해야하는지 잘 모르겠습니다.rabbitmq에서 연결 풀링과 채널간에 성능 차이가 있습니까?

실제 작업을 수행하는 데 채널이 필요하다는 것을 알고 있지만 연결 당 하나의 채널을 갖는 성능상의 이점이 있습니다 (대기열에서 더 많은 처리량 측면에서)? 또는 응용 프로그램 당 하나의 연결을 사용하고 여러 채널을 풀링하는 것이 더 좋습니다.

참고 : 리소스를 풀링하기 때문에 연결 비용이 채널보다 비쌉니다. 초기 비용은 중요하지 않습니다. 나는 처리량에 더 관심이 있습니다.

답변

70

이 부분은 rabbitmq website에 있으며 아래쪽에 있습니다. 아래 관련 부분을 인용했습니다.

tl; dr 버전은 애플리케이션 당 1 개의 연결과 스레드 당 1 개의 연결을 가져야한다는 것입니다. 희망이 도움이됩니다.

연결

AMQP 연결은 일반적으로 수명이 긴 있습니다. AMQP는 안정적인 전달을 위해 TCP를 사용하는 응용 프로그램 수준의 프로토콜입니다. AMQP 연결 인증을 사용하며 TLS (SSL)를 사용하여 보호 할 수 있습니다. 응용 프로그램을 더 이상 AMQP 브로커에 연결할 필요가없는 경우 이 갑자기 기본 TCP 연결을 종료하는 대신 이 AMQP 연결을 정상적으로 닫아야합니다.

채널

일부 응용 프로그램은 AMQP 브로커에 여러 개의 연결이 필요합니다. 그러나 동시에 많은 TCP 연결을 열린 상태로 유지하는 것은 바람직하지 않습니다. 이렇게하면 시스템 리소스가 소모되어 더 많은 방화벽을 구성하기가 어려워 지므로 에 동시에 열어 두는 것이 바람직하지 않습니다. AMQP 0-9-1 연결은 "단일 TCP 연결을 공유하는 가벼운 연결"로 생각할 수있는 채널로 다중화 된 입니다.

처리를 위해 다중 스레드/프로세스를 사용하는 응용 프로그램의 경우 스레드/프로세스 당 새 채널을 열고 그 사이에 채널을 공유하지 않는 것이 일반적입니다. 특정 채널에

통신 따라서 모든 AMQP 방법은 클라이언트가 상기 방법은 이에 대해 (그리고 어떤 채널 알아낼 사용 채널 번호, 이벤트 핸들러의 요구를 운반 다른 채널 통신와는 완전히 예를 들어, ).

스레드가 안전하더라도 스레드 당 1 개의 채널이 있으므로 하나의 채널을 통해 여러 스레드가 전송 될 수 있습니다. 귀하의 응용 프로그램 측면에서 스레드 당 1 채널을 고집하는 것이 좋습니다.

또한 채널당 소비자가 한 명인 것이 좋습니다.

다음은 지침 일 뿐이므로 어떤 테스트가 가장 적합한 지 확인해야합니다.

이 스레드는 통찰력을 herehere 있습니다. 이러한 모든 지침 this post에도 불구하고

은 대부분 여러 개의 연결함으로써 성능에 영향을주지 않습니다 제안합니다. 그것은 클라이언트 측 또는 서버 (rabbitmq) 측면에 대해 이야기하고 있는지 여부는 명확하지 않지만. 한 가지 점은 더 많은 연결을 통해 더 많은 시스템 리소스를 사용한다는 것입니다. 이것이 문제가 아니며 더 많은 처리량을 원할 경우 this post이 다중 연결을 제안하면 더 많은 처리량을 제공하므로 여러 연결을 갖는 것이 좋습니다. 이유는 여러 채널이 있어도 한 번에 하나의 메시지 만 연결을 통과하는 것입니다. 따라서 큰 메시지는 전체 연결을 차단하거나 하나의 채널에있는 중요하지 않은 메시지가 많으면 동일한 연결이지만 다른 채널의 중요한 메시지를 차단할 수 있습니다. 다시 자원이 문제입니다. 하나의 연결로 모든 대역폭을 다 사용하는 경우 추가 연결을 추가하면 한 연결에서 두 개의 채널을 사용하는 것보다 성능이 향상되지 않습니다. 또한 각 연결은 더 많은 메모리, CPU 및 파일 핸들을 사용하지만, 스케일링 할 때 문제가 될 수는 있지만 걱정하지 않아도됩니다. 허용 대답에 추가

+2

거짓 - "채널 스레드 안전 채널 인스턴스가 여러 thread로 안전하게 사용할 수 있습니다.채널에 대한 요청은 직렬화되며 한 번에 하나의 스레드 만 채널에서 명령을 실행할 수 있습니다. 그럼에도 불구하고, 응용 프로그램은 여러 스레드에서 동일한 채널을 공유하는 대신 스레드 당 채널을 사용하는 편이 낫습니다. "API 문서 – djechlin

+1

ok edit. 당연히 내가 썼다는 것이 이상합니다. 문서가 변경되었을 가능성이 있습니까? 1 개의 소비자, 1 개의 채널, 1 개의 스레드 – robthewolf

+5

채널이 스레드에 안전한지 여부는 구현에 따라 다르며 Java impl은 안전하지만 .net은 안전하지 않습니다. . http://stackoverflow.com/a/17829906/709537 –

14

: 당신이 앞에로드 밸런서, 또는 수명이 짧은 DNS 중 하나와 RabbitMQ 노드의 클러스터가있는 경우

(다른 토끼 노드 각각에 연결하는 것이 가능하게 시간이 경과하면), 단일의 장기간 연결은 하나의 응용 프로그램 노드가 단일 RabbitMQ 노드와 독점적으로 작동한다는 것을 의미합니다. 이로 인해 하나의 RabbitMQ 노드가 다른 노드보다 많이 활용 될 수 있습니다.

위에서 언급 한 다른 관심사는 출판 및 소모가 메시지를 큐에 이르게 차단 동작 점이다. 연결이 많으면 각 메시지 처리 시간이 다른 메시지를 차단하지 않습니다. 2. 큰 메시지가 다른 메시지를 차단하지 않습니다. 그것은 내가하지 않은으로

+3

및 제안하는이 작은 연결 풀을 참조하십시오. 제공되는 것입니까, 아니면 직접 구현해야합니까? – Mahdi

0

"쓰레드 당 하나 개의 채널은" 안전한 가정 수 있습니다 (I가 힘을 말한다 (마음에 위의 제기 자원 문제를 가진) 작은 연결 풀을 가지고 고려 가치가 왜

은 그입니다 자신에 의해 어떤 연구를했고 나는 문서를 :) 의심) 그러나 이것은 나누기 경우가 있다는 것을주의 할 이유가 없다 : 당신은 RabbitMQ Direct reply-to로 RPC를 사용하는 경우

는 당신에게 같은 채널을 다시 사용할 수 없습니다를 다른 사람 RP를 위해 소비하십시오 C 요청. 나는 google user group에 그에 대한 자세한 내용은 질문과 나는 (적극적으로 RabbitMQ 개발에 관여하는 것으로 보인다) 마이클 Klishin에서 얻은 대답은

직접 응답이 채널을 공유하는 두 방법을 사용하는 것은 아닙니다하는 것이 었습니다 .

나는amq.rabbitmq.reply-to은 후드 아래에 작동하고 난 여전히 대답 (또는 갱신) 기다리고 방법 을 설명하는 자신의 문서를 업데이트 할 수 중추적 인 이메일을했습니다.

그래서 당신이 직접 회신에 함께 잘 작동하지 않습니다으로 "쓰레드 당 하나 개의 채널"조심에 충실하려는 경우.

관련 문제