Quando il consumatore riceve il messaggio e il compito di elaborazione è completato, invierà un ack con questo identificatore del messaggio per informare il server che il messaggio è stato ricevuto e che l'elaborazione è completata. RabbitMQ attende che il collegamento del consumatore che elabora un messaggio venga perso prima di determinare che il messaggio non è stato elaborato correttamente, quindi RabbitMQ ritrasmette il messaggio. La conferma dei messaggi è disattivata di default. C'è un parametro noAck quando si inizializza Consumer,Se impostato su vero, il consumatore risponderà con un ack non appena riceve il messaggio。
In generale, lo scenario comunemente usato noack è generalmente valido, ma per progetti con requisiti ad alto rischio, come il pagamento. Per ogni messaggio, dobbiamo garantirne l'integrità e la correttezza. Dopo aver ricevuto il messaggio, devi confermare che la logica di business corretta sia stata eseguita, e poi restituire attivamente un ack al server. Puoi visualizzare i messaggi nella coda tramite il comando rabbitmqctl list_queues nome message_rady message_unacknowleded, oppure tramite l'interfaccia di gestione background.
Se noAck è impostato su falso, il client deve inviare attivamente un ack al server e, se il client non conferma il messaggio, si verifica la seguente situazione:
Finché il programma è ancora in esecuzione, questi 10 messaggi rimangono non inseriti e non possono essere riconsegnati da RabbitMQ. Ciò che è ancora più potente è cheIl consumo dei messaggi di RabbitMQ non ha un meccanismo di timeout, cioè, se il programma non viene riavviato, il messaggio sarà sempre nello stato Uncked. Non dimenticare questi messaggi di stato non registrati quando lavori sugli eventi operativi.
Pronto
I messaggi con questo stato esistono nella coda da elaborare.
Non riconosciuto
Un messaggio in questo stato indica che è già in fase di elaborazione ma non è stato confermato.
Quando il programma è chiuso (finché il Consumer è chiuso), questi 10 messaggi torneranno allo stato Ready.
Messaggio di conferma
E se il client invia un ack al server? Cioè, confermare la ricezione del messaggio? Il codice è il seguente:
Quando il secondo parametro del metodo BasicAck, multiple, viene impostato su false, significa che RabbitMQ viene notificato che il messaggio corrente è stato confermato.Se vero, verrà riconosciuto un messaggio aggiuntivo più piccolo del tag di consegna specificato dal primo parametro。 (La conferma in blocco riguarda l'intero canale)
Annulla conferma
E se uno dei client del programma distribuito ha un'eccezione e vuole annullare la conferma del messaggio lasciando che altri client elaborino il messaggio?
Quando c'è un'eccezione nel messaggio di consumo, dobbiamo annullare la conferma, e poi possiamo usare il metodo basicReject di Channel.
Il primo parametro specifica il tag di consegna, mentre il secondo parametro descrive come gestire questo messaggio di fallimento.Un valore di vero significa che il messaggio viene reinserito nell'intestazione della coda, mentre un valore di falso significa che il messaggio è stato abbandonato。
|