Amazon Simple Queue Service (SQS) per le code lavori
da Massimo Della Rovere · pubblicato il 10 aprile, 2014 · modificato il 15 luglio, 2016

Amazon SQS è un sistema di code che consente alle applicazioni, in maniera veloce e affidabile, di accodare messaggi da scambiarsi tra di loro in maniera asincrona, ogni messaggio a sua volta può generare altre elaborazioni più specifiche. Questo sistema permette di creare ambienti altamente scalabili e convertire applicazioni complesse in diverse unità di elaborazione più semplici e indipendenti tra di loro.

Per capirci possiamo immaginare uno scenario qualsiasi, ad esempio abbiamo una procedura web che riceve delle richieste di upload video, questa applicazione invece di convertire il video e generare le immagini di copertina corrispondenti, accoda solo un messaggio. Questo a sua volta sarà elaborato da un componente diverso, magari anche su server diverso, il quale farà risparmiare tempo all’applicazione principale che a sua volta non deve attendere il ciclo completo per elaborare la prossima richiesta di upload.

Introduzione

Utilizzando Amazon SQS è possibile separare i componenti di una applicazione in modo che possano funzionare in maniera indipendente. Ogni componente di una applicazione può memorizzare messaggi in una coda fail-safe. I messaggi possono contenere fino a 256 KB di testo in qualsiasi formato. Ogni componente può successivamente recuperare i messaggi a livello di programmazione utilizzando le Amazon SQS API.

La coda agisce come da buffer tra il componente che produce e memorizza i dati e il componente che riceve i dati per l’elaborazione. Questo significa che la coda risolve i problemi che possono sorgere quando il componente che produce i dati produce più lavoro di quanto il componente di ricezione possa elaborare. Oppure se il producer e il consumer non sono connessi in maniera continuativa alla rete.

Amazon SQS

Amazon SQS assicura la consegna di ogni messaggio almeno una volta e supporta multipli Readers e Writers che interagiscano con la stessa coda. Una singola coda può essere utilizzata contemporaneamente da molti componenti di applicazioni distribuite senza la necessità che questi componenti si coordino l’uno con l’altro.

Uno dei compromessi risultanti è che Amazon SQS non garantisce il first in, first out nella consegna dei messaggi. Per molte applicazioni distribuite ogni messaggio ha una sua autonomia e siccome tutti i messaggi vengono recapitati, l’ordine non è più importante. Se il proprio sistema richiede che l’ordine debba essere rispettato, è possibile inserire delle informazioni di sequenza all’interno di ogni messaggio così da poterli riordinare tramite applicazione quando la coda li restituisce.

Funzioni principali

Questo è l’elenco della feature che sono disponibili nel servizio di Amazon SQS:

  • Redundant infrastructure: garantisce almeno una volta la consegna dei messaggi, accesso concorrente e alta disponibilità per l’invio e il recupero dei messaggi.
  • Multiple writers and readers: più parti possono inviare e ricevere messaggi allo stesso tempo. Amazon SQS blocca i messaggi durante la loro elaborazione.
  • Configurable settings per queue: le code non devono essere necessariamente tutte uguali, ad esempio una coda può essere ottimizzata per una tipologia di messaggi che richiedono più tempo di elaborazione rispetto ad altre.
  • Variable message size: i messaggi possono arrivare ad una dimensione massima di 262.144 bytes (256KB). Per i messaggi di dimensione superiore ai 256 KB è possibile utilizzare Amazon S3 per la memorizzazione del contenuto del messaggio e utilizzare Amazon SQS per mantenere il puntatore a Amazon S3 o all’oggetto. In alternativa è possibile dividere il messaggio in parti più piccole.
  • Access control:  è possibile gestire i permessi su chi può inviare il messaggio alla coda e su chi è autorizzato a ricevere il messaggio dalla coda.
  • Delay queues: viene impostato per definire il tempo di ritardo per l’invio di tutti i messaggi che sono stati inseriti. Se questo valore viene modificato, il nuovo valore avrà effetto solo per i messaggi che verranno accodati dopo la modifica.

Ambiente Scalabile

Utilizzare un’applicazione basata su Amazon SQS non consente solo di semplificare l’applicazione principale e un miglioramento di performance generale ma permette di ottenere un’ambiente altamente scalabile. Ad esempio prendiamo un software di crawel utilizzato da un motore di ricerca, non solo è un progetto complesso che riguarda gli algoritmi di memorizzazione ma lo è anche per quello che riguarda la dinamica per la raccolta delle informazioni, in questo caso una gestione a code è una buona soluzione.

Amazon SQS

In questo esempio, incominciando da sinistra, abbiamo le pagine presenti in internet che vengono lette da una serie di server, quest’ultimi ad ogni lettura invece di analizzare la pagina demandano con un messaggio la funzione ad un’altro processo, il quale sempre con una serie di server provvede ad uno smistamento più specifico, ad esempio spedire messaggi di richiesta su code per l’analisi del contenuto HTML, code specifiche per le immagini, documenti PDF etc etc. Queste code vengono processati da software che memorizzano un risultato su un database comune. In questa maniera ogni componente vive di vita propria e non è influenzato dalla velocità degli altri.

Proprietà

Una coda può essere vuota se non gli sono stati inviati messaggi oppure se sono stati cancellati tutti i messaggi al suo interno. Bisogna assegnare un nome ad ogni coda, una coda può essere cancellata in qualsiasi momento, piena o vuota che sia. Amazon SQS può cancellare una coda senza preavviso se non risulta una delle seguenti azioni per almeno 30 giorni consecutivi: SendMessage, ReceiveMessage, DeleteMessage, GetQueueAttributes, SetQueueAttributes, AddPermission e RemovePermission.

Importante: si tratta di una violazione della destinazione d’uso di Amazon SQS se si creano ripetutamente code e poi le si lasciano inattive, o se si archiviano quantità eccessive di dati nelle code. Infatti le code sono studiate per processare messaggi il prima possibile e non per memorizzare informazioni permanenti.

At-Least-Once DeliveryAmazon SQS memorizza più copie di un messaggio su più server per motivi di ridondanza. In rare occasioni potrebbe capitare che uno dei server che mantiene una copia del messaggio, potrebbe non essere disponibile quando si riceve o si cancella un messaggio. Nel caso si verifichi una circostanza del genere, la copia del messaggio memorizzata sul server non disponibile non verrà cancellata, ed è possibile che si possa ricevere un’ulteriore copia quando si ricevono i messaggi. Per questo motivo bisogna disegnare una applicazione che sia idempotente (ovvero, l’applicazione non deve risentirne se viene processato lo stesso messaggio più di una volta).

Queue URLs: quando si crea una nuova coda bisogna fornire un nome che sia univoco all’interno dell’ambito di tutte le code possedute da un account AWS. Amazon SQS assegna ad ogni coda creata un identificativo chiamato “queue url” che include il nome della coda e altri componenti che Amazon SQS determina. Ogni volta che si vuole eseguire un’azione su una coda bisogna utilizzare il “queue url”.

Message IDs: ogni messaggio riceve un “message ID” che Amazon SQS ci restitusce in risposta ad un “SendMessage“. Questo identificatore è utile per identificare il messaggio, ma per cancellare il messaggio serve il “receipt handle” e non è possibile farlo con il message ID. La lunghezza massima di un message ID è di 100 caratteri.

Receipt Handles: ogni volta che si riceve un messaggio da una coda, noi riceviamo un puntatore per questo messaggio. Il puntatore viene associato all’atto di ricevere il messaggio e non con il messaggio stesso. Per cancellare il messaggio o per cambiare la visibilità del messaggio bisogna fornire il “receipt handle” e non il “message ID”. Questo significa che bisogna sempre ricevere il messaggio prima di poterlo cancellare (non è possibile inserire un messaggio in una coda e quindi richiamarlo). La lunghezza massima del puntatore di messaggio è di 1024 caratteri.

Tempo di visibilità

Quando un componente del nostro sistema riceve ed elabora un messaggio proveniente da una coda, il messaggio rimane all’interno della coda.  Perchè non viene cancellato automaticamente? Parlando di un sistema distribuito non c’è alcuna garanzia che il componente possa ricevere il messaggio (una connessione interrotta o un componente bloccato durante la ricezione). Per questo, Amazon SQS non cancella il messaggio e deve essere la nostra applicazione a cancellarlo dalla coda dopo averlo ricevuto.

Il messaggio una volta ricevuto rimane ancora nella sua coda, nello stesso tempo però non si desidera che gli altri componenti ricevano nuovamente il messaggio, pertanto il messaggio viene bloccato utilizzando il “visibility timeout” che è un periodo di tempo durante il quale Amazon SQS impedisce agli altri di ricevere il messaggio.

Amazon SQS

C’è un limite sul numero di messaggi “inflight” che possono rimanere dentro la coda, e questo numero è di 120.000. Si considerano messaggi “inflight” quei messaggi che sono stati ricevuti ma che ancora non sono stati cancellati dalla coda. Se si raggiunge il limite massimo dei 120.000 si riceverà un errore di OverLimit message. Per evitare questo limite si consiglia di cancellare subito i messaggi una volta elaborati, oppure è anche possibile aumentare il numero di code che processano i messaggi.

Ogni coda è impostata con un visibility timeout di default di 30 secondi, è possibile cambiare questo valore per l’intera coda. Quando si riceve un messaggio è anche possibile impostare un valore speciale di visibility timeout per i messaggi ricevuti senza modificare il timeout generale della coda. Se si ha un sistema che produce messaggi che richiedono una quantità variabile di tempo per l’elaborazione e la cancellazione si consiglia di creare più code con diversi valori di visibility timeout.

Guida completa su AWS

Questo articolo appartiene ad una serie di pubblicazioni che costituiscono una guida completa dedicata agli Amazon Web Services.  Molti servizi che trattiamo in questo blog vengono anche spiegati con dei video che trovate nel nostro canale youtube. Se volete seguire questo percorso didattico iscrivetevi alla community Cloud AWS.

condividi