Scalabilità basata su Amazon SQS - Dimensionamento automatico Amazon EC2

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

Scalabilità basata su Amazon SQS

Importante

Le seguenti informazioni e passaggi mostrano come calcolare il backlog della coda di Amazon SQS per istanza utilizzando l'attributo ApproximateNumberOfMessages queue prima di pubblicarlo come metrica personalizzata su. CloudWatch Tuttavia, ora puoi ridurre i costi e limitare il lavoro necessario per pubblicare il parametro personalizzato utilizzando la matematica dei parametri. Per ulteriori informazioni, consulta Creazione di una policy di dimensionamento con monitoraggio degli obiettivi per Dimensionamento automatico Amazon EC2 tramite la matematica dei parametri.

In questa sezione viene illustrato come dimensionare il gruppo con scalabilità automatica in risposta alle modifiche apportate al carico di sistema in una coda Amazon Simple Queue Service (Amazon SQS). Per ulteriori informazioni su come utilizzare Amazon SQS, consulta Guida per sviluppatori Amazon Simple Queue.

Vi sono alcuni scenari in cui si potrebbe pensare al dimensionamento in risposta a un'attività in una coda Amazon SQS. Ad esempio, supponi di avere un'app Web che permette agli utenti di caricare immagini e di utilizzarle online. In questo scenario, ogni immagine richiede il ridimensionamento e la codifica, prima di poter essere pubblicata. L'app viene eseguita su istanze EC2 in un gruppo con scalabilità automatica configurato per gestire le tipiche percentuali di caricamento. Le istanze non integre vengono terminate e sostituite per mantenere i livelli di istanze correnti in qualsiasi momento. L'app colloca i dati bitmap grezzi delle immagini in una coda SQS per l'elaborazione. Le elabora e pubblica le immagini elaborate dove possono essere visualizzate dagli utenti. L'architettura per questo scenario funziona bene se il numero di caricamenti di immagini non varia nel tempo. Tuttavia, se il numero di caricamenti cambia nel tempo, per scalare la capacità del gruppo con scalabilità automatica, potresti prendere in considerazione l'utilizzo del dimensionamento dinamico.

Utilizzare il monitoraggio degli obiettivi con il giusto parametro

Se utilizzi una policy di dimensionamento con monitoraggio degli obiettivi basato su un parametro personalizzato della coda Amazon SQS, il dimensionamento dinamico può adattarsi in modo più efficace alla curva di domanda dell'applicazione. Per ulteriori informazioni sulla scelta dei parametri per il monitoraggio degli obiettivi, consulta Selezionare i parametri..

Il problema legato all'utilizzo di una metrica di CloudWatch Amazon SQS come ApproximateNumberOfMessagesVisible per il tracciamento delle destinazioni è che il numero di messaggi nella coda potrebbe non cambiare proporzionalmente alla dimensione del gruppo Auto Scaling che elabora i messaggi dalla coda. Ciò accade perché il numero di messaggi nella coda SQS non definisce esclusivamente il numero di istanze necessarie. Il numero di istanze nel gruppo con scalabilità automatica può essere determinato da più fattori, tra cui la quantità di tempo necessaria per elaborare un messaggio e la quantità di latenza (ritardo della coda) accettabile.

La soluzione è utilizzare un parametro backlog per instance (backlog per istanza) dove il valore di destinazione è il backlog accettabile per istanza da mantenere. È possibile calcolare questi valori nel modo seguente:

  • Backlog per instance (Backlog per istanza): per calcolare il backlog per istanza, occorre partire dall'attributo della coda ApproximateNumberOfMessages per determinare la lunghezza della coda SQS (numero di messaggi disponibili per il recupero dalla coda). Per ottenere il backlog per istanza, questo numero va diviso per la capacità in esecuzione del parco istanze, che per un gruppo con scalabilità automatica è il numero di istanze nello stato InService.

  • Acceptable backlog per instance (Backlog accettabile per istanza): per calcolare il valore di destinazione, prima determina ciò che l'applicazione può accettare in termini di latenza. Quindi dividi il valore di latenza accettabile per il tempo medio che un'istanza EC2 richiede per elaborare un messaggio.

Ad esempio, supponiamo che al momento si disponga di un gruppo con scalabilità automatica con 10 istanze e il numero di messaggi visibili nella coda (ApproximateNumberOfMessages) è 1500. Se il tempo di elaborazione medio è 0,1 secondi per ogni messaggio e la latenza massima accettabile è 10 secondi, il backlog per istanza accettabile è 10/0,1, ovvero 100 messaggi. Questo significa che 100 è il valore di destinazione per la policy con monitoraggio degli obiettivi. Quando il backlog per istanza raggiunge il valore target, si verificherà un evento di aumentazione orizzontale. Poiché il backlog per istanza è già di 150 messaggi (1500 messaggi / 10 istanze), il gruppo si aumenta orizzontalmente e si aumenta orizzontalmente di cinque istanze per mantenere la proporzione con il valore target.

Nelle procedure seguenti viene illustrato come pubblicare il parametro personalizzato e creare una policy di dimensionamento con monitoraggio degli obiettivi che permetta di configurare il gruppo con scalabilità automatica in modo che venga dimensionato in base a questi calcoli.

Importante

Ricorda di utilizzare la matematica dei parametri per ridurre i costi. Per ulteriori informazioni, consulta Creazione di una policy di dimensionamento con monitoraggio degli obiettivi per Dimensionamento automatico Amazon EC2 tramite la matematica dei parametri.

Sono tre, le parti principali di questa configurazione:

  • Un gruppo con scalabilità automatica per gestire le istanze EC2 per l'elaborazione dei messaggi provenienti dalla coda SQS.

  • Una metrica personalizzata da inviare ad Amazon CloudWatch che misura il numero di messaggi in coda per istanza EC2 nel gruppo Auto Scaling.

  • Una politica di tracciamento degli obiettivi che configura il gruppo Auto Scaling in modo che venga scalato in base alla metrica personalizzata e a un valore target impostato. CloudWatch gli allarmi richiamano la politica di scalabilità.

Nel diagramma seguente viene illustrata l'architettura di questa configurazione.

Dimensionamento automatico Amazon EC2 usando il diagramma architettonico delle code

Limitazioni e prerequisiti

Per utilizzare questa configurazione, devi essere consapevole delle seguenti limitazioni:

  • È necessario utilizzare AWS CLI o un SDK su cui pubblicare la metrica personalizzata. CloudWatch Puoi quindi monitorare la tua metrica con. AWS Management Console

  • La console Dimensionamento automatico Amazon EC2 non supporta policy di dimensionamento con monitoraggio degli obiettivi che utilizzano parametri personalizzati. È necessario utilizzare AWS CLI o un SDK per specificare una metrica personalizzata per la politica di scalabilità.

Le seguenti sezioni ti spiegano come utilizzare AWS CLI per le attività che devi eseguire. Ad esempio, per ottenere i dati dei parametri che riflettono l'uso attuale della coda, è possibile utilizzare il comando SQS get-queue-attributes. Assicurati che la CLI sia installata e configurata.

Prima di iniziare, dovrai disporre di una coda Amazon SQS da utilizzare. Le seguenti sezioni presuppongono che si disponga già di una coda (standard o FIFO), di un gruppo con scalabilità automatica e di istanze EC2 che eseguono l'applicazione che utilizza la coda. Per ulteriori informazioni su Amazon SQS, consulta la Guida per gli sviluppatori di Amazon Simple Queue Service).

Configurazione del dimensionamento in base ad Amazon SQS

Passaggio 1: creare una metrica CloudWatch personalizzata

Un parametro personalizzato viene definito utilizzando uno spazio dei nomi e un nome parametro a scelta. Gli spazi dei nomi per i parametri personalizzati non possono iniziare con AWS/. Per ulteriori informazioni sulla pubblicazione di metriche personalizzate, consulta l'argomento Pubblica metriche personalizzate nella Amazon CloudWatch User Guide.

Segui questa procedura per creare la metrica personalizzata leggendo prima le informazioni dal tuo account. AWS Successivamente, calcola il parametro backlog per istanza, come suggerito in una sezione precedente. Infine, pubblica questo numero su con una granularità CloudWatch di 1 minuto. Quando possibile, consigliamo vivamente di dimensionare in base ai parametri con una granularità di 1 minuto, per garantire una risposta più rapida alle modifiche apportate al carico del sistema.

Per creare una metrica personalizzata () CloudWatch AWS CLI
  1. Utilizza il comando get-queue-attributes di SQS per ottenere il numero di messaggi in attesa nella coda (ApproximateNumberOfMessages).

    aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456789/MyQueue \ --attribute-names ApproximateNumberOfMessages
  2. Utilizza il comando describe-auto-scaling-groups per ottenere la capacità di esecuzione del gruppo, ovvero il numero di istanze nello stato del ciclo di vita InService. Questo comando restituisce le istanze di un gruppo con scalabilità automatica insieme allo stato del loro ciclo di vita.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg
  3. Calcola il backlog per istanza dividendo il numero approssimativo di messaggi disponibili per il recupero dalla coda per la capacità operativa del gruppo.

  4. Crea uno script che viene eseguito ogni minuto per recuperare il valore del backlog per istanza e pubblicarlo su una CloudWatch metrica personalizzata. Quando pubblichi una metrica personalizzata, specifichi il nome, lo spazio dei nomi, l'unità, il valore e nessuna o più dimensioni del parametro. Una dimensione è composta da un nome di dimensione e un valore di dimensione.

    Per pubblicare il parametro personalizzato, sostituisci i valori segnaposto in corsivo con il nome del parametro preferito, il valore del parametro, uno spazio dei nomi (purché non inizi con “AWS”) e dimensioni (opzionale), quindi esegui il seguente comando put-metric-data.

    aws cloudwatch put-metric-data --metric-name MyBacklogPerInstance --namespace MyNamespace \ --unit None --value 20 --dimensions MyOptionalMetricDimensionName=MyOptionalMetricDimensionValue

Dopo che l'applicazione ha emesso la metrica desiderata, i dati vengono inviati a. CloudWatch La metrica è visibile nella console. CloudWatch Puoi accedervi accedendo AWS Management Console e accedendo alla pagina. CloudWatch Puoi visualizzare il parametro passando alla pagina dei parametri oppure cercandolo nella casella di ricerca. Per informazioni sulla visualizzazione dei parametri, consulta Visualizza i parametri disponibili nella Amazon CloudWatch User Guide.

Fase 2: creazione una policy di dimensionamento con monitoraggio degli obiettivi

Il parametro creato può ora essere aggiunto a una policy di dimensionamento con monitoraggio degli obiettivi.

Creazione di una policy di dimensionamento con monitoraggio degli obiettivi (AWS CLI)
  1. Utilizza il comando cat seguente per archiviare un valore di destinazione per la policy di dimensionamento e una specifica del parametro personalizzato in un file JSON con nome config.json nella directory principale. Sostituisci ciascun placeholder input dell'utente con le tue informazioni. Per TargetValue, calcola il backlog accettabile per accettabile e inseriscilo qui. Per calcolare questo numero, stabilisci un valore di latenza normale e dividilo per il tempo medio necessario per elaborare un messaggio, come descritto in una precedente sezione.

    Se non hai specificato alcuna dimensione per il parametro creato nel passaggio 1, non includere alcuna dimensione nel parametro specifico personalizzato.

    $ cat ~/config.json { "TargetValue":100, "CustomizedMetricSpecification":{ "MetricName":"MyBacklogPerInstance", "Namespace":"MyNamespace", "Dimensions":[ { "Name":"MyOptionalMetricDimensionName", "Value":"MyOptionalMetricDimensionValue" } ], "Statistic":"Average", "Unit":"None" } }
  2. Utilizza il comando put-scaling-policy insieme al file config.json creato nella fase precedente per creare la policy di dimensionamento.

    aws autoscaling put-scaling-policy --policy-name sqs100-target-tracking-scaling-policy \ --auto-scaling-group-name my-asg --policy-type TargetTrackingScaling \ --target-tracking-configuration file://~/config.json

    Ciò crea due allarmi: uno per l'aumento e uno per la riduzione orizzontali. Restituisce inoltre l'Amazon Resource Name (ARN) della policy con cui è registrata CloudWatch, che CloudWatch utilizza per richiamare la scalabilità ogni volta che la soglia metrica viene violata.

Fase 3: test delle policy di dimensionamento

Una volta completata la configurazione, verifica che la policy di dimensionamento funzioni. Puoi testarla incrementando il numero di messaggi nella coda SQS e verificando che il gruppo con scalabilità automatica abbia avviato un'istanza EC2 aggiuntiva. Puoi testarla anche diminuendo il numero di messaggi nella coda SQS e verificando che il gruppo con scalabilità automatica abbia terminato un'istanza EC2.

Per testare la funzione di aumento orizzontale
  1. Segui i passaggi descritti in Creazione di una coda Amazon SQS standard e invio di un messaggio o Creazione di una coda Amazon SQS FIFO e invio di un messaggio per aggiungere messaggi alla coda. Verifica di aver aumentato il numero di messaggi nella coda in modo che il parametro backlog per istanza superi il valore di destinazione.

    Possono trascorrere alcuni minuti prima che le modifiche richiamino l'allarme.

  2. Per verificare che il gruppo abbia avviato un'istanza, utilizza il comando describe-auto-scaling-groups.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg
Come testare la funzione di riduzione orizzontale
  1. Segui i passaggi descritti in Ricevere ed eliminare un messaggio (console) per eliminare i messaggi dalla coda. Verifica di aver ridotto il numero di messaggi nella coda, in modo che il parametro backlog per istanza sia inferiore al valore di destinazione.

    Possono trascorrere alcuni minuti prima che le modifiche richiamino l'allarme.

  2. Utilizza il comando describe-auto-scaling-groups per verificare che il gruppo abbia terminato un'istanza.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg

Amazon SQS e la protezione per la riduzione orizzontale delle istanze

I messaggi che non sono stati elaborati nel momento in cui un'istanza viene terminata vengono restituiti alla coda SQS dove possono essere elaborati da un altro daemon su un'istanza ancora in esecuzione. Per le applicazioni in cui vengono eseguite attività di lunga durata, è possibile utilizzare facoltativamente la protezione per la riduzione orizzontale dell'istanza per avere il controllo su quali dipendenti della coda vengono terminati quando il gruppo con scalabilità automatica viene ridotto.

Lo pseudocodice seguente mostra un modo per proteggere i processi di lavoro a esecuzione prolungata e basati sulla coda dalla terminazione della riduzione orizzontale.

while (true) { SetInstanceProtection(False); Work = GetNextWorkUnit(); SetInstanceProtection(True); ProcessWorkUnit(Work); SetInstanceProtection(False); }

Per ulteriori informazioni, consulta Progetta le tue applicazioni su Dimensionamento automatico Amazon EC2 per gestire senza problemi la terminazione delle istanze.