Prima di tutto, abbiamo 100 messaggi non elaborati sul nostro server rabbitmq, apriamo un client consumer a caso e si presenta la seguente situazione,
100 dati spostati in un istante, ma non possiamo elaborare così tanti dati contemporaneamente con un singolo cliente, cosa dovremmo fare?
Come mostrato nell'immagine sopra, non abbiamo confermato la ricezione del messaggio! Se il produttore continua a inviarlo, noi consumatori continueremo a riceverlo!
Immagina solo se un singolo consumatore potesse elaborare fino a 60 messaggi in 1 minuto, tuttavia un produttore potrebbe inviarne 300 in 1 minuto, se,Abbiamo un client consumer che deve ricevere 300 messaggi contemporaneamente in 1 minuto, superando il nostro carico massimo, il che potrebbe portare all'esaurimento delle risorse server e al blocco del client consumer。
RabbitMQ offre una funzione qoS (Quality of Service), cioè, sotto il presupposto di una conferma non automatica dei messaggi, se un certo numero di messaggi (impostando il valore di Qos in base a consume o channel) non viene confermato, nuovi messaggi non verranno consumati.
prefetchSize:0 prefetchCount: Dice a RabbitMQ di non inviare più di N messaggi a un consumatore contemporaneamente, cioè una volta che ci sono N messaggi che non sono ancora stati ack, il consumatore bloccherà finché non ci sarà un messaggio ack global:true\false Che le impostazioni sopra si applichino ai canali, per dirla semplicemente, che le restrizioni riguardino il livello del canale o quello del consumatore
Nota: Si dice che prefetchSize e global non siano implementati da rabbitmq, quindi per il momento non li studierò
prefetch_count entra in vigore quando no_ask=falso,Cioè, nel caso della risposta automatica, questi due valori sonoNon è in effettidi
Imposta prefetchCount = 3 tramite il metodo BasicQos. Questo permette a RabbitMQ di elaborare fino a 3 messaggi per consumatore contemporaneamente. In altre parole, non distribuirà nuovi Messaggi al consumatore finché non riceverà l'ack. Ecco come configurarlo:
Come si può vedere nella figura, ci sono due consumatori che ascoltano Queue contemporaneamente, ma si noti che il messaggio qui verrà automaticamente accettato solo se viene consumato da un consumatore, e l'altro non riceverà più questo messaggio.
Introduzione al sito ufficiale: http://www.rabbitmq.com/consumer-prefetch.html
Si noti che questo metodo può far sì che la coda sia piena. Naturalmente, potresti dover aggiungere più Consumer o creare più virtualHost per perfezionare il tuo design.
|