Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Le migliori pratiche per l'ottimizzazione e l'efficienza delle prestazioni in Amazon MQ for RabbitMQ
Puoi ottimizzare le prestazioni del broker Amazon MQ for RabbitMQ massimizzando il throughput, riducendo al minimo la latenza e garantendo un utilizzo efficiente delle risorse. Completa le seguenti best practice per ottimizzare le prestazioni delle tue applicazioni.
Passaggio 1: Mantieni le dimensioni dei messaggi al di sotto di 1 MB
Consigliamo di mantenere i messaggi al di sotto di 1 Megabyte (MB) per prestazioni e affidabilità ottimali.
Per impostazione predefinita, RabbitMQ 3.13 supporta messaggi di dimensioni fino a 128 MB, ma i messaggi di grandi dimensioni possono attivare allarmi di memoria imprevedibili che bloccano la pubblicazione e potenzialmente creano un'elevata pressione della memoria durante la replica dei messaggi tra i nodi. I messaggi sovradimensionati possono inoltre influire sui processi di riavvio e ripristino dei broker, il che aumenta i rischi per la continuità del servizio e può causare un peggioramento delle prestazioni.
Archivia e recupera payload di grandi dimensioni utilizzando lo schema di controllo dei reclami
Per gestire messaggi di grandi dimensioni, puoi implementare il claim check pattern archiviando il payload del messaggio in una memoria esterna e inviando solo l'identificatore di riferimento del payload tramite RabbitMQ. Il consumatore utilizza l'identificatore di riferimento del payload per recuperare ed elaborare il messaggio di grandi dimensioni.
Il diagramma seguente mostra come utilizzare Amazon MQ per RabbitMQ e Amazon S3 per implementare il modello di controllo dei claim.

L'esempio seguente dimostra questo modello utilizzando Amazon MQ, l'AWS SDK per Java 2.x e Amazon S3:
-
Innanzitutto, definisci una classe Message che conterrà l'identificatore di riferimento Amazon S3.
class Message { // Other data fields of the message... public String s3Key; public String s3Bucket; }
-
Crea un metodo di pubblicazione che memorizzi il payload in Amazon S3 e invii un messaggio di riferimento tramite RabbitMQ.
public void publishPayload() { // Store the payload in S3. String payload = PAYLOAD; String prefix = S3_KEY_PREFIX; String s3Key = prefix + "/" + UUID.randomUUID(); s3Client.putObject(PutObjectRequest.builder() .bucket(S3_BUCKET).key(s3Key).build(), RequestBody.fromString(payload)); // Send the reference through RabbitMQ. Message message = new Message(); message.s3Key = s3Key; message.s3Bucket = S3_BUCKET; // Assign values to other fields in your message instance. publishMessage(message); }
-
Implementa un metodo consumer che recuperi il payload da Amazon S3, elabori il payload ed elimini l'oggetto Amazon S3.
public void consumeMessage(Message message) { // Retrieve the payload from S3. String payload = s3Client.getObjectAsBytes(GetObjectRequest.builder() .bucket(message.s3Bucket).key(message.s3Key).build()) .asUtf8String(); // Process the complete message. processPayload(message, payload); // Delete the S3 object. s3Client.deleteObject(DeleteObjectRequest.builder() .bucket(message.s3Bucket).key(message.s3Key).build()); }
Fase 2: Utilizzo e consumatori longevi basic.consume
L'utilizzo basic.consume
con un consumatore longevo è più efficiente rispetto all'utilizzo di sondaggi per singoli messaggi. basic.get
Per ulteriori informazioni, vedere Sondaggi per singoli messaggi
Fase 3: Configurare il prefetching
È possibile utilizzare il valore di pre-fetching di RabbitMQ per ottimizzare il modo in cui i consumatori consumano i messaggi. RabbitMQ implementa il meccanismo di pre-fetching del canale fornito da AMQP 0-9-1 applicando il conteggio di pre-fetching ai consumatori rispetto ai canali. Il valore di pre-fetching viene utilizzato per specificare quanti messaggi vengono inviati al consumatore in un dato momento. Per impostazione predefinita, RabbitMQ imposta una dimensione del buffer illimitata per le applicazioni client.
Ci sono una varietà di fattori da considerare quando si imposta un conteggio pre-fetching per i consumatori RabbitMQ. Innanzitutto, l'ambiente e la configurazione dei consumatori. Poiché i consumatori devono conservare tutti i messaggi in memoria durante l'elaborazione, un valore di pre-fetching elevato può influire negativamente sulle prestazioni dei consumatori e, in alcuni casi, far causare potenzialmente a un consumatore un crash generale. Allo stesso modo, il broker RabbitMQ stesso mantiene tutti i messaggi che invia memorizzati nella cache fino a quando non riceve il riconoscimento del consumatore. Un valore di pre-fetching elevato può causare l'esaurimento della memoria del server RabbitMQ rapidamente se il riconoscimento automatico non è configurato per i consumatori e se i consumatori impiegano un tempo relativamente lungo per elaborare i messaggi.
Tenendo presente le considerazioni di cui sopra, si consiglia di impostare sempre un valore di pre-fetching per evitare situazioni in cui un broker RabbitMQ o i suoi consumatori esauriscano la memoria a causa di un numero elevato di messaggi non elaborati o non riconosciuti. Se è necessario ottimizzare i broker per elaborare grandi volumi di messaggi, è possibile testare i broker e i consumatori utilizzando una serie di conteggi pre-fetching per determinare il valore in cui il sovraccarico di rete diventa in gran parte insignificante rispetto al tempo impiegato da un consumatore per elaborare i messaggi.
Nota
Se le applicazioni client sono configurate per confermare automaticamente il recapito dei messaggi ai consumatori, l'impostazione di un valore di pre-fetching non avrà alcun effetto.
Tutti i messaggi sottoposti a pre-fetching vengono rimossi dalla coda.
L'esempio seguente dimostra l'impostazione di un valore pre-fetching di 10
per un singolo consumatore che utilizza la libreria client Java RabbitMQ.
ConnectionFactory factory = new ConnectionFactory(); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.basicQos(10, false); QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume("my_queue", false, consumer);
Nota
Nella libreria client Java RabbitMQ, il valore predefinito per il flag global
è impostato su false
, quindi l'esempio precedente può essere scritto semplicemente come channel.basicQos(10)
.
Fase 4: Usare Celery 5.5 o versione successiva con code quorum
Python Celery
Per tutte le versioni di Celery
-
Disattiva
task_create_missing_queues
per ridurre l'affollamento della coda. -
Quindi, disattivala
worker_enable_remote_control
per interrompere la creazione dinamica delle code.celery@...pidbox
Ciò ridurrà il tasso di abbandono delle code per il broker.worker_enable_remote_control = false
-
Per ridurre ulteriormente l'attività dei messaggi non critici, disattiva Celery non includendolo
-E
o worker-send-task-events--task-events
contrassegnandolo all'avvio dell'applicazione Celery. -
Avvia l'applicazione Celery utilizzando i seguenti parametri:
celery -A app_name worker --without-heartbeat --without-gossip --without-mingle
Per le versioni 5.5 e successive di Celery
-
Effettua l'aggiornamento alla versione 5.5 di Celery
, la versione minima che supporta le code quorum, o a una versione successiva. Per verificare quale versione di Celery stai utilizzando, usa. celery --version
Per ulteriori informazioni sulle code quorum, vedere. Code quorum per RabbitMQ su Amazon MQ -
broker_transport_options = {"confirm_publish": True}