Ambienti worker Elastic Beanstalk - AWS Elastic Beanstalk

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

Ambienti worker Elastic Beanstalk

Se la tua applicazione AWS Elastic Beanstalk esegue operazioni o flussi di lavoro che richiedono molto tempo, è possibile scaricare tali attività in un ambiente lavoratore dedicato. Il disaccoppiamento del front-end della tua applicazione Web da un processo che esegue le operazioni di blocco è un modo comune per assicurare che la tua applicazione rimanga reattiva sotto carico.

Un'attività con esecuzione lunga è tutto ciò che sostanzialmente aumenta il tempo necessario per completare una richiesta, ad esempio l'elaborazione di immagini o video, l'invio di e-mail oppure la generazione di un archivio ZIP. Queste operazioni possono richiedere solo un secondo o due per essere completate, ma alcuni secondi di ritardo è molto per una richiesta Web che altrimenti verrebbe completata in meno di 500 millisecondi.

Un'opzione è generare un processo lavoratore in locale, restituire una risposta positiva ed elaborare le attività in modo asincrono. Questo funziona se la tua istanza è in grado di eseguire tutte le operazioni inviate. In presenza di un carico elevato, tuttavia, un'istanza può essere sovraccaricata da attività in background e non rispondere alle richieste di priorità superiore. Se i singoli utenti sono in grado di generare più attività, l'aumento del carico potrebbe non corrispondere a un aumento degli utenti, rendendo più complesso un ridimensionamento efficiente a livello di server Web.

Per evitare di eseguire localmente le attività con esecuzione a lungo termine puoi usare l'SDK AWS per il tuo linguaggio di programmazione per inviarle a una coda Amazon Simple Queue Service (Amazon SQS) e avviare il processo che le esegue in un set separato di istanze. Le istanze lavoratore vengono quindi progettate per richiedere solo gli elementi dalla coda quando hanno la capacità di eseguirli, evitando così di sovraccaricarle.

Gli ambienti worker Elastic Beanstalk semplificano questo processo gestendo la coda Amazon SQS ed eseguendo un processo daemon su ciascuna istanza che legge dalla coda automaticamente. Quando il daemon preleva un elemento dalla coda, invia una richiesta HTTP POST in locale per http://localhost/ sulla porta 80 con i contenuti del messaggio della coda nel corpo. Tutto quello di cui ha bisogno l'applicazione è eseguire l'attività di lunga esecuzione in risposta al POST. È possibile configurare il daemon per pubblicare su un altro percorso, utilizzare un tipo MIME diverso dall'applicazione/JSON, connettersi a una coda esistente o personalizzare le connessioni (numero massimo di richieste simultanee), il timeout e i tentativi.

Elaborazione dei messaggi di Amazon SQS nell'ambiente worker di Elastic Beanstalk

Con le attività periodiche, è anche possibile configurare il daemon lavoratore per accodare i messaggi in base a una pianificazione cron Ogni attività periodica può essere resa disponibile su un percorso diverso. Abilita le attività periodiche includendo un file YAML nel tuo codice sorgente che definisce la pianificazione e il percorso per ogni attività.

Nota

.NET sulla piattaforma Windows Server non supporta gli ambienti lavoratore.

Daemon SQS dell'ambiente lavoratore

Gli ambienti worker eseguono un processo daemon fornito da Elastic Beanstalk. Questo daemon è aggiornato regolarmente per aggiungere funzionalità e risolvere i bug. Per ottenere la versione più recente del daemon, esegui l'aggiornamento all'ultima versione della piattaforma.

Quando l'applicazione nell'ambiente worker restituisce una risposta 200 OK per dichiarare che ha ricevuto ed elaborato correttamente la richiesta, il daemon invia una chiamata DeleteMessage alla coda Amazon SQS per eliminare il messaggio dalla coda. Se l'applicazione restituisce una risposta diversa da 200 OK, prima di reinserire il messaggio nella coda Elastic Beanstalk attende che termini l'intervallo ErrorVisibilityTimeout configurato. Se non c'è risposta, prima di reinserire il messaggio nella coda Elastic Beanstalk attende che l'intervallo InactivityTimeout termini, in modo che il messaggio sia disponibile per un altro tentativo di elaborazione.

Nota

Le proprietà delle code Amazon SQS (ordine dei messaggi, distribuzione at-least-once e campionamento dei messaggi) possono influire sulla modalità di progettazione di un'applicazione Web per un ambiente worker. Per maggiori informazioni, consulta l'argomento relativo alle proprietà delle code distribuite nella Guida per gli sviluppatori di Amazon Simple Queue Service.

Amazon SQS elimina automaticamente i messaggi che sono stati in una coda per un periodo superiore al RetentionPeriod configurato.

Il daemon imposta le seguenti intestazioni HTTP.

Intestazioni HTTP

Nome Value (Valore)

User-Agent

aws-sqsd

aws-sqsd/1.11

X-Aws-Sqsd-Msgid

ID messaggio SQS, utilizzato per rilevare le tempeste di messaggi (un numero insolitamente elevato di nuovi messaggi).

X-Aws-Sqsd-Queue

Nome della coda SQS.

X-Aws-Sqsd-First-Received-At

Orario UTC, in formato ISO 8601, quando il messaggio è stato ricevuto.

X-Aws-Sqsd-Receive-Count

Conteggio messaggi SQS ricevuti.

X-Aws-Sqsd-Attr-message-attribute-name

Attributi dei messaggi personalizzati assegnati al messaggio in fase di elaborazione. Il messaggio message-attribute-name è il nome dell'attributo effettivo del messaggio. Tutti gli attributi di stringa e di messaggio numero vengono aggiunti all'intestazione. Gli attributi binari verranno eliminati e non saranno inclusi nell'intestazione.

Content-Type

Configurazione di tipo mime; per impostazione predefinita, application/json.

Code DLQ

Gli ambienti worker Elastic Beanstalk supportano le code DLQ di Amazon Simple Queue Service (Amazon SQS). Una coda DLQ è una coda a cui altre code (origini) possono inviare messaggi che, per qualche motivo, non sono stati elaborati correttamente. Uno dei principali vantaggi dell'utilizzo di una coda DLQ è la possibilità di mettere da parte e isolare i messaggi non elaborati in modo corretto. È quindi possibile analizzare i messaggi inviati alla coda DLQ per cercare di stabilire il motivo per cui non sono stati elaborati correttamente.

Per impostazione predefinita, una coda DLQ viene abilitata per un ambiente worker se specifichi una coda Amazon SQS generata automaticamente al momento della creazione di un livello dell'ambiente worker. Se scegli una coda SQS esistente per il tuo ambiente lavoratore, è necessario utilizzare SQS per configurare una coda DLQ in modo indipendente. Per informazioni su come utilizzare SQS per configurare una coda DLQ, consulta Using Amazon SQS Dead Letter Queues.

Non è possibile disabilitare le code DLQ. I messaggi che non possono essere distribuiti vengono infine inviati a una coda DLQ. È possibile, tuttavia, disattivare questa funzione in modo efficiente impostando l'opzione MaxRetries sul massimo valore valido di 100.

Se una coda DLQ non è configurata per la coda Amazon SQS dell'ambiente worker, Amazon SQS mantiene i messaggi nella coda fino alla scadenza del periodo di conservazione. Per informazioni dettagliate sulla configurazione del periodo di conservazione, consulta Configurazione degli ambienti lavoratore.

Nota

L'opzione MaxRetries di Elastic Beanstalk equivale all'opzione MaxReceiveCount di SQS. Se l'ambiente lavoratore non utilizza una coda SQS autogenerata, utilizza l'opzione MaxReceiveCount in SQS per disabilitare correttamente la coda DLQ. Per ulteriori informazioni, consulta Using Amazon SQS Dead Letter Queues.

Per ulteriori informazioni sul ciclo di vita di un messaggio SQS, consulta l'argomento relativo al ciclo di vita dei messaggi.

Attività periodiche

È possibile definire le attività periodiche in un file denominato cron.yaml nel tuo bundle di origine per aggiungere automaticamente processi alla coda dell'ambiente lavoratore a intervalli regolari.

Ad esempio, il file cron.yaml seguente crea due attività periodiche. La prima viene eseguita ogni 12 ore, mentre la seconda tutti i giorni alle 23.00.

Esempio cron.yaml
version: 1 cron: - name: "backup-job" url: "/backup" schedule: "0 */12 * * *" - name: "audit" url: "/audit" schedule: "0 23 * * *"

Il name deve essere univoco per ogni attività. L'URL è il percorso su cui viene inviata la richiesta POST per attivare l'attività. La pianificazione è un'espressione CRON che stabilisce quando viene eseguita l'operazione.

Quando viene eseguita un'attività, il daemon pubblica un messaggio nella coda SQS dell'ambiente con un'intestazione che indica l'attività che deve essere eseguita. Ogni istanza dell'ambiente può prendere il messaggio ed elaborare l'attività.

Nota

Se configuri l'ambiente worker con una coda SQS esistente e scegli una coda FIFO Amazon SQS, le attività periodiche non sono supportate.

Elastic Beanstalk impiega l'elezione dei leader per stabilire quale istanza nell'ambiente worker sposta in coda l'attività periodica. Ogni istanza tenta di diventare leader scrivendo su una tabella Amazon DynamoDB. La prima istanza che va a buon fine è quella leader che deve continuare a scrivere sulla tabella per mantenere lo stato di leader. Se l'istanza leader è inutilizzabile, un'altra istanza prende rapidamente il suo posto.

Per le attività periodiche, il daemon lavoratore imposta le seguenti intestazioni aggiuntive.

Intestazioni HTTP

Nome Value (Valore)

X-Aws-Sqsd-Taskname

Per le attività periodiche, il nome dell'attività da eseguire.

X-Aws-Sqsd-Scheduled-At

L'orario in cui è stata programmata l'attività periodica

X-Aws-Sqsd-Sender-Id

Numero dell'account AWS del mittente del messaggio

Utilizzo di Amazon CloudWatch per la scalabilità automatica nei livelli dell'ambiente worker

Insieme, Amazon EC2 Auto Scaling e CloudWatch monitorano l'utilizzo della CPU delle istanze in esecuzione nell'ambiente worker. Il modo in cui configuri il limite della scalabilità automatica per capacità di CPU determina il numero di istanze che il gruppo Auto Scaling esegue per gestire correttamente il throughput di messaggi nella coda Amazon SQS. Ogni istanza EC2 pubblica i parametri di utilizzo della CPU su CloudWatch. Amazon EC2 Auto Scaling recupera da CloudWatch l'utilizzo medio della CPU in tutte le istanze dell'ambiente worker. È possibile configurare il limite superiore e inferiore e il numero di istanze da aggiungere o terminare in base alla capacità della CPU. Quando Amazon EC2 Auto Scaling rileva che è stato raggiunto il limite massimo specificato per la capacità della CPU, Elastic Beanstalk crea nuove istanze nell'ambiente worker. Le istanze vengono eliminate quando il carico della CPU scende al di sotto della soglia.

Nota

I messaggi che non sono stati elaborati nel momento in cui un'istanza viene terminata vengono restituiti alla coda dove possono essere elaborati da un altro daemon su un'istanza che è ancora in esecuzione.

Puoi anche impostare altri allarmi CloudWatch, in base alle esigenze, utilizzando la console Elastic Beanstalk, l'interfaccia a riga di comando o il file delle opzioni. Per ulteriori informazioni, consulta Utilizzo di Elastic Beanstalk con Amazon CloudWatch e l'argomento relativo alla creazione di un gruppo Auto Scaling con policy di dimensionamento di fasi.

Configurazione degli ambienti lavoratore

È possibile gestire la configurazione di un ambiente worker modificando la categoria Worker nella pagina Configuration (Configurazione) della console di gestione dell'ambiente.

Pagina di configurazione Modify worker (Modifica operatore) nella console Elastic Beanstalk
Nota

È possibile configurare il percorso URL per la pubblicazione di messaggi della coda di lavoro, ma non è possibile configurare la porta IP. Elastic Beanstalk pubblica sempre i messaggi della coda operatore sulla porta 80. L'applicazione dell'ambiente di lavoro o il relativo proxy devono essere in ascolto sulla porta 80.

Per configurare il daemon lavoratore
  1. Apri la console Elastic Beanstalk e nell'elenco Regions (Regioni) seleziona la tua Regione AWS.

  2. Nel pannello di navigazione selezionare Environments (Ambienti), quindi selezionare il nome dell'ambiente dall'elenco.

    Nota

    Se si dispone di molti ambienti, utilizzare la barra di ricerca per filtrare l'elenco degli ambienti.

  3. Nel riquadro di navigazione, seleziona Configuration (Configurazione).

  4. Nella categoria di configurazione Worker scegliere Edit (Modifica).

La pagina di configurazione Modify worker (Modifica worker) presenta le opzioni seguenti.

Nella sezione Queue (Coda):

  • Worker queue (Coda operatore): specifica la coda Amazon SQS da cui legge il daemon. Se disponibile, puoi scegliere una cosa esistente. Se scegli Autogenerated queue (Coda generata automaticamente), Elastic Beanstalk crea una nuova coda Amazon SQS e un Worker queue URL (URL coda operatore) corrispondente.

    Nota

    Quando scegli Autogenerated queue (Coda generata automaticamente), la coda creata da Elastic Beanstalk è una coda standard Amazon SQS. Quando scegli una coda esistente, puoi fornire una coda standard o FIFO Amazon SQS. Se si fornisce una coda FIFO, le attività periodiche non sono supportate.

  • Worker queue URL (URL coda operatore): se scegli una Worker queue (Coda operatore) esistente, questa impostazione visualizza l'URL associato a quella coda Amazon SQS.

Nella sezione Messages (Messaggi):

  • HTTP path (Percorso HTTP): specifica il percorso relativo dell'applicazione che riceverà i dati dalla coda Amazon SQS. I dati vengono inseriti nel corpo di un messaggio POST HTTP. Il valore di default è /.

  • MIME type (Tipo MIME): indica il tipo MIME impiegato dal messaggio HTTP POST. Il valore di default è application/json. Tuttavia, qualsiasi valore è valido perché è possibile creare e quindi specificare un tipo MIME proprio.

  • HTTP connections (Connessioni HTTP): specifica il numero massimo di connessioni che il daemon può effettuare simultaneamente per qualsiasi applicazione in un'istanza Amazon EC2. Il valore predefinito è 50. Puoi specificare un valore da 1 a 100.

  • Visibility timeout (Timeout visibilità): il periodo di tempo espresso in secondi durante il quale un messaggio in ingresso da una coda Amazon SQS è bloccato per l'elaborazione. Trascorso il periodo di tempo impostato, il messaggio è di nuovo visibile nella coda per la lettura da parte di un altro daemon. Scegli un valore di tempo più lungo rispetto a quello che prevedi la tua applicazione utilizzerà per elaborare messaggi, fino a 43200 secondi.

  • Error visibility timeout (Timeout visibilità errore): il periodo di tempo espresso in secondi che decorre prima che Elastic Beanstalk restituisca un messaggio alla coda Amazon SQS dopo un tentativo di elaborazione non riuscito con errore esplicito. Puoi specificare un valore da 0 a 43200 secondi.

Nella sezione Advanced options (Opzioni avanzate):

  • Max retries (Numero massimo di tentativi): specifica il numero massimo di volte che Elastic Beanstalk tenta di inviare il messaggio alla coda Amazon SQS prima di spostare il messaggio alla coda DLQ. Il valore di default è 10. Puoi specificare un valore da 1 a 100.

    Nota

    L'opzione Max retries (Numero massimo di tentativi) si applica solo alle code Amazon SQS configurate con una coda DLQ. Per tutte le code Amazon SQS che non sono configurate con una coda DLQ, Amazon SQS conserva i messaggi nella coda e li elabora fino al raggiungimento del periodo specificato dall'opzione Retention period (Periodo di conservazione).

  • Connection timeout (Timeout connessione): il periodo di attesa espresso in secondi delle connessioni con esito positivo a un'applicazione. Il valore di default è 5. Puoi specificare un valore da 1 a 60 secondi.

  • Inactivity timeout (Timeout inattività): il periodo di attesa espresso in secondi della risposta di una connessione esistente a un'applicazione. Il valore di default è 180. Puoi specificare un valore da 1 a 36000 secondi.

  • Retention period (Periodo di conservazione): il periodo di tempo espresso in secondi durante il quale un messaggio è valido e viene elaborato attivamente. Il valore di default è 345600. Puoi specificare un valore da 60 a 1209600 secondi.

Se utilizzi una coda Amazon SQS esistente, le impostazioni configurate al momento della creazione di un ambiente worker possono entrare in conflitto con le impostazioni configurate direttamente in Amazon SQS. Ad esempio, se configuri un ambiente worker con un valore RetentionPeriod superiore al valore MessageRetentionPeriod impostato in Amazon SQS, Amazon SQS elimina il messaggio quando supera il MessageRetentionPeriod.

Al contrario, se il valore RetentionPeriod configurato nelle impostazioni dell'ambiente worker è inferiore al valore MessageRetentionPeriod impostato in Amazon SQS, il daemon elimina il messaggio prima di Amazon SQS. Per VisibilityTimeout, il valore che viene configurato per il daemon nelle impostazioni dell'ambiente worker ignora l'impostazione VisibilityTimeout di Amazon SQS. Assicurati che i messaggi vengano eliminati correttamente confrontando le impostazioni di Elastic Beanstalk con le impostazioni di Amazon SQS.