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 delle prestazioni e l'efficienza in Amazon MQ per RabbitMQ
Puoi ottimizzare le prestazioni del tuo 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 inferiori a 1 MB
Consigliamo di mantenere i messaggi al di sotto di 1 Megabyte (MB) per prestazioni e affidabilità ottimali.
RabbitMQ 3.13 supporta messaggi di dimensioni fino a 128 MB per impostazione predefinita, ma i messaggi di grandi dimensioni possono attivare allarmi di memoria imprevedibili che bloccano la pubblicazione e potenzialmente creare un'elevata pressione sulla memoria durante la replica dei messaggi tra i nodi. I messaggi di grandi dimensioni 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 il modello di verifica dei reclami
Per gestire messaggi di grandi dimensioni, è possibile implementare il modello di verifica del reclamo 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 verifica dei reclami.
L'esempio seguente dimostra questo modello utilizzando Amazon MQ, l'AWS SDK per Java 2.x e Amazon S3: https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html
-
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: Usa basic.consume e long-life consumer
L'utilizzo basic.consume con un consumatore longevo è più efficiente rispetto all'utilizzo di singoli messaggi. basic.get Per ulteriori informazioni, vedere Polling 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: Usa Celery 5.5 o versione successiva con le code di quorum
Python Celery
Per tutte le versioni Celery
-
Disattiva
task_create_missing_queuesper ridurre il tasso di abbandono della coda. -
Quindi, disattiva
worker_enable_remote_controlper interrompere la creazione dinamica delle code.celery@...pidboxCiò ridurrà l'abbandono delle code da parte del broker.worker_enable_remote_control = false -
Per ridurre ulteriormente l'attività non critica relativa ai messaggi, disattiva Celery worker-send-task-events non
includendoli o contrassegnandoli all'avvio dell'applicazione Celery. -E--task-events -
Avviate l'applicazione Celery utilizzando i seguenti parametri:
celery -A app_name worker --without-heartbeat --without-gossip --without-mingle
Per le versioni Celery 5.5 e successive
-
Esegui l'upgrade alla versione 5.5 di Celery
, la versione minima che supporta le code di quorum, o una versione successiva. Per verificare quale versione di Celery stai utilizzando, usa. celery --versionPer ulteriori informazioni sulle code relative al quorum, vedere. Code quorum per RabbitMQ su Amazon MQ -
Dopo l'aggiornamento a Celery 5.5 o versioni successive, configura su «quorum».
task_default_queue_typehttps://docs.celeryq.dev/en/stable/userguide/configuration.html#std-setting-task_default_queue_type -
Quindi, devi anche attivare Publish Confirms in Broker Transport Options: https://docs.celeryq.dev/en/stable/userguide/configuration.html#std-setting-broker_transport_options
broker_transport_options = {"confirm_publish": True}