Le migliori pratiche per l'ottimizzazione e l'efficienza delle prestazioni in Amazon MQ for RabbitMQ - Amazon MQ

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.

Diagram showing data flow between Producer, Consumer, Amazon MQ broker, and AWS S3.

L'esempio seguente dimostra questo modello utilizzando Amazon MQ, l'AWS SDK per Java 2.x e Amazon S3:

  1. 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; }
  2. 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); }
  3. 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, un sistema di coda di attività distribuito, può generare molti messaggi non critici quando si verifica un carico di attività elevato. Questa attività aggiuntiva del broker può attivare l'allarme di memoria di RabbitMQ e portare all'indisponibilità del broker. Per ridurre la possibilità di attivare un allarme di memoria, procedi come segue:

Per tutte le versioni di Celery

  1. Disattiva task_create_missing_queuesper ridurre l'affollamento della coda.

  2. 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
  3. Per ridurre ulteriormente l'attività dei messaggi non critici, disattiva Celery non includendolo -E o worker-send-task-events--task-eventscontrassegnandolo all'avvio dell'applicazione Celery.

  4. 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

  1. 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

  2. Dopo l'aggiornamento a Celery 5.5 o versione successiva, configurare a «quorum». task_default_queue_type

  3. Quindi, è necessario attivare anche le conferme di pubblicazione nelle opzioni di trasporto del broker:

    broker_transport_options = {"confirm_publish": True}