Configurazione di un’istanza Amazon Ec2

Oggi ho pubblicato il seguente post sul blog indigeni digitali:
http://blog.indigenidigitali.com/amazon-ec2/

In questo post viene descritto:

  1. Come configurare un’istanza Amazon Ec2 da zero.
  2. Come reperire istanze configurate dal sito bitnami.org
  3. Considerazioni sul risparmio economico che un Cloud può offrire.

Amazon SQS

In questi giorni ho effettuato un po’ di test utilizzando Simple Queue Service (Amazon SQS), che a mio avviso é un servizio eccezionale!
Ho trovato interessante il fatto che SQS è stato uno dei primi servizi che amazon ha realizzato per scalare i propri server.
Questo post è un approfondimento dell’articolo “Message-Oriented Middleware capitolo  II
, dove sto sperimentado i servizi  di Amazon per bilanciare richieste complesse sui server.
Il test simula le richieste di un acquisto on-line, dove gli ordini vengono salvati in una coda SQS ed in seguito rielaborati.

Il codice è stato sviluppato in Java con l’sdk di Amazon(http://aws.amazon.com/sdkforjava/).
L’account di Amazon usato è di tipo  “AWS Free Usage Tier” (http://aws.amazon.com/free/) .Il test si divide in due fasi:
  1. Invio del messaggio sul cloud.
  2. Ricezione ed elaborazione del messaggio dal cloud.

1. INVIO DEL MESSAGGIO
Il messaggio, proveniente da un webserver, viene preso in consegna e rediretto verso una coda SQS, di seguito un pezzo di codice in java per l’invio del messaggio.

Class SQS{

xml message String xmlexample = "<Order> <iduser>XYZ</iduser> <idoperation>555555</idoperation> <mailoperation>mail@mailmail.com</mailoperation> <bookid>5556677999</bookid> </Order>";

ThreadPoolExecutor poolexc = new ThreadPoolExecutor(10, 10, 50000L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue()); for (int j = 0; j < 500; j++) {     poolexc.execute(new Task(j+xmlexample,j)); }
poolexc.shutdown();

Task Class
public void run()
{
queue us-east String myQueueUrl ="https://sqs.us-east-1.amazonaws.com/44444/queue-1";//
try {
request SendMessageRequest sq = new SendMessageRequest(myQueueUrl,_xml); /// send message sqs.sendMessage(sq);
.....

La classe SQS simula un carico di 500 richieste di un xml (lungo 143) con un ThreadPoolExecutor di 10 elementi, quindi la responsabilità del modulo Request.Aumentando il numero di task sul ThreadPoolExecutor si aumenta il throughput, ovviamente il numero task va deciso in base ai server e al tipo di connessione. Un valore troppo elevato potrebbe avere l’effetto contrario.

Eseguendo il test dalla mia normalissima connessione di casa ho avuto i seguenti risultati:

****** Start Request Time:2011-04-26 17:06:16:616

****** End Request 499 at 17:06:28:919  (post ultimo messaggio )

(circa 41 messaggi al secondo).
Ho provato lo stesso JAR su una istanza MICRO EC2 (debian) ed ho ripetuto il test avendo i seguenti risultati:
XMLExample len:143

****** Start Request :2011-04-26 15:15:38:1538

****** End Request  task 499 at 15:15:40:832  (post ultimo messaggio )

(circa 250 messaggi al secondo).

Ovviamente sull’istanza EC2 è molto più veloce.

Il throughput non è elevatissimo ma, considerando tutte le garanzie offerte dal servizio, direi che é ottimo. N.B. Le performance indicate non possono essere prese come riferimento, ma solo come indicazione.

2. RICEZIONE DEL MESSAGGIO

Per ricevere i messaggi dalla coda bisogna effettuare un pool di lettura.

Il modulo Elab a tempo controlla se ci sono messaggi, di seguito un pezzo di codice per la ricezione del messaggio:

ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl);
message receiveMessageRequest.setMaxNumberOfMessages(10);
List messages = sqs.receiveMessage(receiveMessageRequest).getMessages();
if (messages.size()>0)
{ for (Message message : messages) {
elabmessage(message )
String messageRecieptHandle = message.getReceiptHandle(); sqs.deleteMessage(new DeleteMessageRequest(myQueueUrl, messageRecieptHandle))
};

Quando il server è scarico può ricevere il messaggio elaborarlo e cancellarlo.

Invio e ricezione completati.

Note:
SQS di default salva il messaggio per 4 giorni, volendo si può estendere a 2 settimane, ma l’idea è che il messaggio dovrebbe essere processato subito.
Un messaggio può essere al massimo di 64k, per informazioni più grandi bisogna utilizzare altre tecniche.
Data la natura distribuita del sistema, SQS non garantisce la sequenzialità dei messaggi.
Ogni volta che un messaggio viene preso in consegna è opportuno cancellarlo.

Conclusioni

Amazon SQS è un ottimo servizio a messaggi che può essere usato sia sui server che sui dispositivi mobile.
Come tutti i servizi Amazon ci sono a disposizione varie regions da poter utilizzare , quindi c’è la garanzia di continuità è decisamente elevata.

In questo esempio non c’è un throughput elevatissimo (specialmente dalla mia rete ), ma l’idea è che il redirect sul cloud deve essere fatto solo dei messaggi ritenuti importanti, quindi se riesci a vendere 250 libri al secondo per tutto l’anno puoi anche permetterti delle istanze più grandi e linee più veloci :)!!

SQS ha un costo che, secondo me, se hai un bel business è trascurabile. Studiando i casi d’uso di amazon c’è chi ha installato un broker ( es:RabbitMQ,ActiveMQ eccc) su delle istanze EC2. Questa soluzione può aumentare le performance e diminuire i costi, ma il cluster dei broker non è più gestito da Amazon, per cui possono aumentare i punti di failover.

Su una istanza EC2 sto provando FuseMessageBroker basato su ActiveMQ.

SNS e SQS in Amazon cloud

Da appasiontato di sistemi messaggistica ho iniziato lo studio del cloud amazon partendo dai servizi :
Amazon Simple Notification Service (Amazon SNS) e Amazon Simple Queue Service (Amazon SQS).Entrambi sono sistemi di messaggistica ma con ruoli diversi, SQS è un sistema a code dove il producer invia un messaggio , messaggio che può essere ricevuto anche in un secondo momento dal consumer. SNS è un publish/subscribe di tipo uno a molti, un messaggio può essere inviato a più consumer contemporaneamente.In breve il mio esperimento è stato il seguente:

  1. Ho creato un topic SNS dalla console da AWS manager console.
  2. Ho creato una serie di sottoscrittori di tipo MAIL,HTTP e SQS.
  3. Ho inviato un messaggio dalla console dalla AWS console.

Ovviamente il test è andato a buon fine, tutti i sottoscrittori hanno ricevuto il messaggio con tecniche diverse:

  1. Sottoscrittore MAIL:  SNS invia una mail con il testo del messaggio.
  2. Sottoscrittore HTTP:  SNS invia una POST sul link del sottoscrittore inserito.
  3. Sottoscrittore SQS:  SNS posta il messaggio in coda, in seguito il consumer ( nel mio caso in Java)  riceve il messaggio lo elabora e lo cancella dalla coda.
Sono rimasto piacevolmente colpito da questi servizi, gli scenari che si possono comprire sono davvero tantissimi, si pensi che una  coda SQS può essere utlizzata sia in un server che in un dispositivo mobile.A breve riporterò l’esempio completo spep by spep.