Primeiramente, temos 100 mensagens não processadas no nosso servidor rabbitmq, abrimos um cliente consumidor aleatoriamente, e a seguinte situação vai aparecer,
100 pedaços de dados, todos passados de uma vez só, mas não conseguimos processar tantos dados ao mesmo tempo com um único cliente, o que devemos fazer?
Como mostrado na imagem acima, não confirmamos o recebimento da mensagem! Se o produtor continuar enviando, nós, consumidores, continuaremos recebendo!
Imagine só, se um consumidor individual pudesse processar até 60 mensagens em 1 minuto, porém, um produtor pode enviar 300 mensagens em 1 minuto, se,Temos um cliente consumidor que precisa receber 300 mensagens ao mesmo tempo em 1 minuto, o que ultrapassou nossa carga máxima, o que pode levar ao esgotamento dos recursos do servidor e ao cliente consumidor travado。
O RabbitMQ oferece um recurso de qualidade de serviço (qoS), isto é, sob a premissa de confirmação não automática das mensagens, se um certo número de mensagens (definindo o valor de QoS com base em consume ou channel) não for confirmado, novas mensagens não serão consumidas.
prefetchSize:0 prefetchCount: Diz ao RabbitMQ para não enviar mais de N mensagens para um consumidor ao mesmo tempo, ou seja, quando houver N mensagens que ainda não foram ackadas, o consumidor bloqueará até que haja um ack de mensagem global:true\false Seja que as configurações acima sejam aplicadas aos canais, para simplificar, se as restrições acima são no nível do canal ou no nível do consumidor
Nota: Dizem que prefetchSize e global não são implementados pelo rabbitmq, então não vou estudá-los por enquanto
prefetch_count entra em vigor quando no_ask=falso,Ou seja, no caso da resposta automática, esses dois valores sãoNão em efeitode
Defina prefetchCount = 3 via método BasicQos. Isso permite que o RabbitMQ processe até 3 mensagens por consumidor ao mesmo tempo. Em outras palavras, ele não distribuirá novas Mensagens ao consumidor até receber o ack. Veja como configurar:
Como você pode ver na figura, há dois consumidores ouvindo o Queue ao mesmo tempo, mas note que a mensagem aqui só será automaticamente acecada se for consumida por um consumidor, e o outro consumidor não receberá essa mensagem novamente.
Introdução ao site oficial: http://www.rabbitmq.com/consumer-prefetch.html
Note que esse método pode fazer com que a fila fique cheia. Claro, talvez você precise adicionar mais Consumidores ou criar mais VirtualHosts para refinar seu design.
|