Cloud Computing Windows Azure (Teil 2)
Kommentare

Storage-Konzepte von Windows Azure
Der Windows Azure Storage bietet drei grundlegende Konzepte. Diese sind die MessageQueue, der Table Storage und der Blob Storage. Die primäre Aufgabe der MessageQueue

Storage-Konzepte von Windows Azure

Der Windows Azure Storage bietet drei grundlegende Konzepte. Diese sind die MessageQueue, der Table Storage und der Blob Storage. Die primäre Aufgabe der MessageQueue ist es, zwischen den einzelnen Rollen zu kommunizieren. Dies könnte beispielsweise der Fall sein, wenn eine WebRole die WorkerRole über die Erstellung von Dokumenten benachrichtigt. In der MessageQueue sollte hier lediglich ein Verweis auf die Daten sein. Die Daten, die in der Queue angegeben sind, könnten nun in einem Table Storage abgelegt sein. Wichtig bei einer Queue ist es, die Nachricht(en) zu löschen, wenn sie abgearbeitet wurden. Wird eine Nachricht abgerufen, so wird diese lediglich für eine gewisse Zeit unsichtbar für andere Methoden, die auf die Queue zugreifen. Würde diese nun nicht gelöscht, können Verarbeitungsvorgänge mehrfach auftreten. Listing 2 stellt einige allgemeine Operationen auf MessageQueues dar.

Listing 2: Verschiedene Operationen einer Queue

CloudQueueClient qclient = new CloudQueueClient(account.QueueEndpoint.ToString(), account.Credentials);
CloudQueueMessage message = new CloudQueueMessage(strMessage.ToString());

CloudQueue queue = qclient.GetQueueReference("doccreates");
queue.CreateIfNotExist();
queue.AddMessage(message);

queueclient = account.CreateCloudQueueClient();
queue = queueclient.GetQueueReference("doccreates");

if(queue.Exists())
      ProcessMessage(queue.GetMessage());

queue.DeleteMessage(cloudQueueMessage);
  

Wesentlich mehr Möglichkeiten stehen nun über den Table Storage zur Verfügung. Im Gegensatz zu traditionellen Datenbanken ist der Table Storage nicht relational. Für den Table Storage ist vor allem eine sehr hohe Skalierung notwendig, das über eben dieses Modell erreicht werden soll. Eine Entität in einer Tabelle hat jeweils einen TimeStamp, einen RowKey und einen PartitionKey. Der RowKey und der PartitionKey ergeben die Eindeutigkeit der Entität. Typischerweise wird der PartitionKey für zusammenhängende Daten verwendet. Der RowKey identifiziert jedes Element innerhalb dieser Partition. Der Vorteil von Partitionen in einer Tabelle ist die vereinfachte Verteilung der Datenbank und die damit bessere Skalierung. Tabellen bestehen aus mindestens zwei Klassen. Die erste Klasse ist hierbei die Entität, die eine Zeile in der Tabelle repräsentiert. Die zweite Klasse ist der Datenkontext, der Operationen auf die Tabelle ermöglicht. Der Datenkontext für eine Tabelle erbt hierbei von TableServiceContext. Die Klasse enthält einen Getter auf die einzelnen Entitäten, die als IQueryable zurückgegeben werden. In Abbildung 3 ist eine Beispielentität dargestellt. Listing 3 stellt einen TableServiceContext für diese Entität dar.

Abb. 3: Beispielentität
Abb. 3: Beispielentität

Listing 3: Beispiel eines Datenkontextes für eine Tabelle

public class EventContext : TableServiceContext
{
    private const string tableName = "Events";

    public EventContext(string baseAdress, StorageCredentials credentials)
        : base(baseAdress, credentials)
    {

    }

    public IQueryable Events
    {
        get
        {
            return CreateQuery(tableName);
        }
    }

    public static string TableName
    {
        get
        {
            return tableName;
        }
    }
}
  

Die letzte Technik im Bunde ist der Blob Storage. Mithilfe des Blob Storages kann man Binary Large Objects ablegen. Kurzum: all jenes, was in einer Tabelle oder MessageQueue einfach keinen Platz hat. Typischerweise sind dies Media-Dateien oder Dokumente, die zur Unterstützung der Website dienen. Für den Blob Storage gibt es einen CloudBlobClient. Auch hier muss man sich wie in der Queue- und Table Storage die Referenz holen. Sollte der Container nicht vorhanden sein, so kann man diesen mit CreateIfNotExist erstellen. Neu für den Container ist nun die Möglichkeit, Zugriffstypen bekannt zu geben. Manche Container benötigen keine restriktiven Sicherheitseinschränkungen und können somit der Allgemeinheit zugänglich gemacht werden. Dies wird über die ContainerPermissions geregelt. Will man Daten in einen Container abspeichern, so geht dies einfach mit der UploadFromStream-Methode. Wie man ein Word-Dokument in einem BlobStorage schreiben kann, ist in Listing 4 ersichtlich.

Listing 4: Eine Datei mittels Blob Storage schreiben

CloudBlobClient client = account.CreateCloudBlobClient();

CloudBlobContainer container = client.GetContainerReference("documents");
container.CreateIfNotExist();

BlobContainerPermissions permissions = new BlobContainerPermissions();
permissions.PublicAccess = BlobContainerPublicAccessType.Container;

container.SetPermissions(permissions);
CloudBlob blob = container.GetBlobReference(filename);
blob.UploadFromStream(ivc.CreateDocument());

blob.Properties.ContentType = "text/docx";
blob.SetProperties();
  

Demoszenario

Auf der Heft-CD (.NET MAGAZIN 10.2010, Anm. d. Red.) befindet sich ein etwas detaillierterer Quellcode einer Windows-Azure-Anwendung. Die Anwendung soll eine Eventregistrierung simulieren. Hierfür werden zwei Rollen eingesetzt: Eine WebRole, um sich für das Event zu registrieren sowie eine WorkerRole, die ein Word-Dokument mithilfe von OpenXML generiert. Ferner werden sämtliche Elemente des Windows Azure Storage verwendet. Ist eine Registrierung erfolgreich, gibt die WebRole Informationen über die Registrierung in eine MessageQueue. Die WorkerRole wartet in einer Schleife auf Arbeitsanweisungen. Sobald eine Nachricht in der MessageQueue vorhanden ist, leitet diese die Bearbeitung ein. Hierfür wird mithilfe von OpenXML automatisch ein Dokument generiert. Dieses wird, damit tatsächlich alle Bereiche des Windows Azure Storage abgedeckt werden, in einem Blob Storage gespeichert. Der Blob Storage dient nun dem Download eines zukünftigen Benutzers (Abb. 4).

Abb. 4: Architektur der Anwendung
Abb. 4: Architektur der Anwendung

In dieser Anwendung wird klar gezeigt, wo Cloud Computing Sinn macht. Ein Ticket-Sales-System kann bei Massenveranstaltungen sehr hohe Auslastungen erreichen. Mit der Unterteilung in WebRole und WorkerRole kann man auch die Auslastung der Anwendung reduzieren. Vorgänge, die mehr Rechenpower benötigen, werden in einer WorkerRole durchgeführt. Diese kann einfach auf mehrere Instanzen erweitert werden. Damit steht einer Parallelisierung von Arbeitsvorgängen nichts mehr im Wege.

Fazit

Mit Windows Azure kann man sehr einfach Anwendungen bauen, die optimal auf die Anforderungen neuartiger Webanwendungen ausgelegt sind. Im Artikel wurden eingangs drei Anwendungstypen vorgestellt, die einen sinnvollen Einsatz von Cloud Computing darstellen sollen. Cloud Computing ist bestimmt nicht das Heilmittel für alle IT-Probleme, jedoch lässt sich durch einen sinnvollen Umgang mit dem Thema sehr vieles erreichen.

Mario Meir-Huber ist Autor bei verschiedenen Fachmagazinen rund um .NET und gibt sein Fachwissen auf Konferenzen weiter. Seine Lieblingstechnologien sind hierbei WPF und Silverlight. Seit der Entstehung der Wolke ist dies jedoch sein absolutes Lieblingsgebiet geworden. Er ist auf Twitter unter „mario_mh“ und unter www.codefest.at erreichbar.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -