Windows Azure – Automatic Scaling System – Parte 1

Uno dei benefici delle piattaforme di Cloud Computing è dato dalla possibilità di gestire il carico di lavoro delle applicazioni che girano su di esso, Windows Azure Platform integra una gestione della scalabilità dell’applicazione pubblicata in Cloud.

Avere un’applicazione scalabile significa offrire sempre il miglior servizio e velocità al costo più basso.

Caso d’uso

Prendiamo come esempio il nostro caso d’uso:

Per RoomShop abbiamo sviluppato un servizio che recupera da vari portali turistici le informazioni sulle camere e le tariffe in vendita nel periodo di 6 mesi e i dati presenti sul sito web possono essere aggiornati in qualsiasi momento della giornata senza alcun preavviso, si suppone che i dati dei prossimi 15 giorni vengano aggiornati più spessi di altri e così via.

Il servizio è quindi stato pubblicato con un minimo di 3 istanze sempre attive che vanno a recuperare i periodi con intervalli di tempo diversi (2h, 6h, 24h). Le istanze sono però risultate poche per il carico di lavoro che era necessario ritrovandoci con più di 10 istanze attive giorno e notte.

La gestione scalabile delle istanze ci ha permesso di ottimizzare il carico di lavoro del nostro Engine restando nei tempi di recupero delle 2h, 6h, 24h riducendo però la spesa mensile per l’hosting dell’applicazione.

Architettura Cloud

L’architettura è formata da:

  • Database SQL Server: DB con le elaborazioni da processare.
  • Servizio di recupero: un servizio scritto in C# pubblicato come worker role in Windows Azure.
  • Servizio di monitoraggio:un servizio scritto in C# pubblicato come worker role in Windows Azure.
    • Controlla il carico di lavoro che deve essere ancora processato.
    • Decide in base al tempo medio di elaborazione se aggiungere o diminuire le istanze.
Azure Schema

Architettura Cloud Windows Azure

Architettura Applicazione

Il servizio di monitoraggio è strutturato essenzialmente in 3 parti:

  • [ManageServices] Gestione API Windows Azure:si occupa della logica di comunicazione con le API di azure.
    • Recupero delle informazioni del deploy e delle istanze.
    • Aggiorna lo status del deploy e delle istanze.
    • Aggiorna il file di configurazione per aumentare o diminuire il numero di istanze.
    • Recupera lo status dell’operazione richiesta (le operazioni sulle API sono asincrone).
  • [ServiceAction] Gestione operazioni: implementa metodi generici per lavorare le informazioni da/a la classe ManageServices.
  • [RoleScaling] Gestione scaling: implementa la logica di scaling. E’ lui che si occuperà di decidere come e quando aumentare o diminuire istanze ed eventuali operazioni complementare sul database.
Azure Class Schema

Architettura Classi

Collegarsi alle API di Windows Azure

Il collegamento alle API di Windows Azure avvengono tramite il protoccollo HTTPS con l’aggiunta del certificato X509.

Per creare il certificato è possibile usare l’eseguibile makecert.exe, disponibile con Windows SDK, con la seguente linea di comando:

makecert -r -pe -a sha1 -n "CN=Windows Azure Authentication Certificate" -ss My -len 2048 -sp "Microsoft Enhanced RSA and AES Cryptographic Provider" -sy 24 azurecert.cer

Il certificato a questo punto è necessario pubblicarlo nel proprio account Windows Azure alla voce Management Certificate.

Possiamo aggiungere il certificato alle resource del progetto ed usare la seguente classe per effettuare le chiamate.

HttpRequest

[codesyntax lang=”csharp” lines=”fancy”]

enum HttpMethod
{
  POST,
  GET
}

class HttpRequest
{
  X509Certificate2 certificate;

  public HttpRequest()
  {
    try
    {
      certificate = GetX509Certificate2("Windows Azure Authentication Certificate");
    }
    catch (Exception ex)
    {
    // Your Exception
    }
  }

  private X509Certificate2 GetX509Certificate2(String subjectName)
  {
    X509Certificate2 x509Certificate2 = null;
    X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    try
    {
      store.Open(OpenFlags.ReadOnly);
      X509Certificate2Collection x509Certificate2Collection =
      store.Certificates.Find(X509FindType.FindBySubjectName, subjectName, false);
      x509Certificate2 = x509Certificate2Collection[0];
    }
    finally
    {
      store.Close();
    }
    return x509Certificate2;
  }

  public void DoHttpRequest(String service, String xml, HttpMethod httpmethod, out String res, out String reqid)
  {
    res = String.Empty;
    reqid = String.Empty;

    HttpWebRequest req = null;
    HttpWebResponse response = null;
    ASCIIEncoding encoding = null;
    byte[] buffer = null;
    Stream newStream = null;
    StreamReader loResponseStream = null;
    Encoding enc = null;

    try
    {
      req = (HttpWebRequest)WebRequest.Create(service);
      req.ClientCertificates.Add(certificate);
      req.UserAgent = "Azure Cloud Management Studio";
      req.Method = httpmethod.ToString();
      req.ProtocolVersion = HttpVersion.Version10;
      req.Headers.Add("x-ms-version", "2009-10-01");
      req.ContentType = "text/xml";

      if (xml != String.Empty)
      {
        encoding = new ASCIIEncoding();
        buffer = encoding.GetBytes(xml);
        req.ContentLength = buffer.Length;
        newStream = req.GetRequestStream();
        newStream.Write(buffer, 0, buffer.Length);
        newStream.Close();
      }

      response = (HttpWebResponse)req.GetResponse();

      enc = System.Text.Encoding.GetEncoding(1252);
      loResponseStream = new StreamReader(response.GetResponseStream(), enc);

      res = loResponseStream.ReadToEnd();

      reqid = response.Headers.GetValues("x-ms-request-id")[0];

      loResponseStream.Close();
      response.Close();
    }
    catch (Exception ex)
    {
      // Your Exception
    }
  }
}

[/codesyntax]

Nel prossimo articolo vedremo il funzionamento della classe ManageServices che si occuperà di comunicare con le API di Windows Azure.

1 commento

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *