2016-12-01 6 views
1

간단한 작업 대기열 보관 라이브러리를 구축하기 위해 NodeJS와 amqplib을 사용하고 있습니다 (서비스에서 사용되는 숫자는 Jackrabbit)과 다소 비슷합니다) 많은 다른 이벤트에 대한 정보를 포함하는 매우 큰 피드를 구문 분석해야합니다.RabbitMQ & NodeJS : 애플리케이션 당 1 개의 연결, 스레드 당 1 개의 채널, 채널 당 1 개의 소비자 지침에 따라

정보가 구문 분석 된 후 수천 개의 큐로 분산되고 (메시지 순서가 고려되어야하는 최소 단위 인 큐입니다.) 소비 된 다음

질문은 다음과 같습니다. '앱당 1 개의 연결, 1 개의 스레드 당 1 개의 채널, 1 개의 채널 당 1 개의 소비자'가이드 라인을 어떻게 준수해야합니까? 이 경우에는? 엄청난 양의 메모리와 리소스를 낭비하게되면 수천 개의 프로세스가 생성됩니다.

참고 : 큐의 각 메시지의 수는 매우 높은되지 않습니다 : 난 당신이 NodeJS가 단일 스레드 코드를 실행할 때 것을 알고 있으리라 믿고있어 가장

+0

내가 말하는 지침은이 게시물에 언급되어 있습니다. http://stackoverflow.com/questions/10407760/is-there-a-performance-difference-between-pooling-connections-or-channels-in- 토끼 – Towerman

답변

4

에서 약 1-2 MSG/초, 귀하의 질문이 어디에서 오는 ...

언어는 채널/소비자가 앉아있는 스레드를 차단하기 때문에 "스레드 당 1 채널"규칙이 중요합니다. 어떤 종류의 consume 호출이 발생하고 스레드가 차단되어 메시지가 표시 될 때까지 대기합니다.

이 때문에 스레드를 지원하는 언어로 채널 당 스레드 수가 1 개 필요합니다.

그러나 NodeJS에서는 구독자가 메시지를 사용하라는 요청이 비 차단입니다.

즉, 1 channel per thread 개념을 안전하게 폐기 할 수 있습니다.

내 NodeJS 및 RabbitMQ 코드는 종종 내 응용 프로그램의 단일 인스턴스에서 수백 개의 채널을 열어줍니다.

채널을 저렴하고 쉽게 열 수 있습니다. 메시지 생성자 또는 소비자를 설정하는 것도 저렴합니다. 실제 비용은 1) 연결에서, 2) 메시지를 받으면 실제 작업을하는 것입니다.

이것은 소비자의 규모를 줄이는 것입니다. NodeJS와 RabbitMQ를 볼 때 메시지 처리량을 모니터링하여 응용 프로그램의 새 인스턴스를 생성 할시기를 결정해야합니다. 지속적으로 증가하는 대기열이 있고 그것이 절대로 소모되지 않으면 (모든 메시지가 처리 된 경우), 사용자의 새 인스턴스를 생성해야합니다.


추가 참고 사항 몇 :

내가보기 엔 당신의 NodeJS/RabbitMQ 요구에 https://github.com/arobson/rabbot를 사용하는 것이 좋습니다. 나는 RabbitMQ를위한 "단순한"NodeJS 라이브러리를 많이 다루었 고, 그들은 모두 받아 들일 수없는 한계를 가지고있다. Rabbot은 RabbitMQ로보다 쉽게 ​​작업 할 수 있도록 더 나은 추상화 레이어를 제공하면서도 필요한 모든 유연성을 제공합니다.

내 RabbitMQ 및 NodeJS 과정을 확인하려면 다음을 참조하십시오. https://sub.watchmecode.net/guides/microservices-with-rabbitmq/ - RabbitMQ 및 NodeJS를 빠르게 익히는 데 도움이되는 스크린 캐스트, 전자 책 및 업계 전문가 인터뷰. 참고로, screecasts는 Wascally를 기본 라이브러리로 사용합니다. Rabbot의 전신 인 Rabbot (Rabbot의 내부 구조를 크게 변경했을 때 Rabbot으로 이름이 바뀜)입니다.

관련 문제