우선, Rabbitmq 서버에 100개의 처리되지 않은 메시지가 있고, 무작위로 소비자 클라이언트를 열면 다음과 같은 상황이 나타납니다.
100개의 데이터가 한순간에 모두 전송되는데, 단일 클라이언트로 동시에 이렇게 많은 데이터를 처리할 수 없습니다. 어떻게 해야 할까요?
위 사진에서 보시다시피, 저희는 메시지 수신 사실을 확인하지 않았습니다! 생산자가 계속 보내면, 우리 소비자들도 계속 받을 수 있을 거야!
상상해 보세요, 만약 우리 단일 소비자가 1분에 최대 60개의 메시지를 처리할 수 있다면, 생산자는 1분에 300개의 메시지를 보낼 수 있습니다.저희는 1분 동안 동시에 300개의 메시지를 받아야 하는 소비자 클라이언트가 있는데, 이 속도가 최대 부하를 초과해 서버 자원이 고갈되고 소비자 클라이언트가 멈출 수 있습니다。
RabbitMQ는 QoS(품질 서비스) 기능을 제공합니다, 즉 메시지의 비자동 확인 전제 하에서, 일정 수의 메시지(소비 또는 채널에 따라 Qos 값을 설정함)가 확인되지 않으면 새로운 메시지가 소비되지 않는다.
프리페치사이즈:0 prefetchCount: RabbitMQ에 한 소비자에게 한 소비자에게 N개 이상의 메시지를 동시에 푸시하지 말라고 지시합니다. 즉, 아직 ack이 되지 않은 N개의 메시지가 있으면 Consumer 사용자가 ack이 있을 때까지 차단합니다 global:true/false 위 설정들이 채널에 적용되는지, 간단히 말해 위의 제한이 채널 수준인지 소비자 수준인지 여부
참고: prefetchSize와 global은 rabbitmq에서 구현되지 않는다고 하니, 당분간 공부하지 않겠습니다
prefetch_count no_ask=거짓일 때 적용됩니다,즉, 자동 응답의 경우 이 두 값은 다음과 같습니다효력 없음의
BasicQos 메서드를 통해 prefetchCount = 3을 설정하세요. 이로 인해 RabbitMQ는 소비자당 최대 3개의 메시지를 동시에 처리할 수 있습니다. 즉, ACK를 받기 전까지는 소비자에게 새로운 메시지를 배포하지 않습니다. 설정하는 방법은 다음과 같습니다:
그림에서 볼 수 있듯이, 두 명의 소비자가 동시에 큐를 듣고 있지만, 이 메시지는 한 소비자가 소비할 때만 자동으로 인식되며, 다른 소비자는 다시 이 메시지를 받지 못합니다.
공식 웹사이트 소개: http://www.rabbitmq.com/consumer-prefetch.html
이 방법은 대기열이 가득 찰 수 있음을 유의하세요. 물론, 더 많은 Consumer를 추가하거나 더 많은 virtualHost를 만들어 디자인을 다듬어야 할 수도 있습니다.
|