woensdag 20 maart 2013

Services in de Clouds

BesteProduct heeft op dit moment één server waarop de database draait en een aantal WCF (Windows Communication Foundation) services. Deze services leveren o.a. de datamodellen aan, die op een andere server worden geconsumeerd door de webapplicatie. Hier wordt vervolgens een mooi jasje om de datamodellen gegoten middels ASP.NET MVC 4. Het resultaat hiervan is wat de  bezoekers uiteindelijk te zien krijgen. De server waarop de webapplicatie draait kan de vraag gemakkelijk aan, maar de server waarop de WCF-services draaien heeft het knap lastig. Hij moeten immers de modelspecifieke data uit de database vissen. Omdat die data uit alle hoeken en gaten moet komen, zijn er vaak nogal wat queries nodig.
In de drukke decembermaand werd pijnlijk duidelijk dat deze server dergelijke piekmaanden nog maar net aankan, maar een volgende feestmaand zal hij niet overleven. Wat kunnen we nu doen:
  1. Processors en meer RAM bijprikken. Kostbare aangelegenheid en niet echt een oplossing, meer een pleister. Vroeg of laat loop je toch tegen het hardwareplafond aan.
  2. Meer machines aanschaffen met een loadbalancer, die de lasten eerlijk verdeelt. Zo zou het eigenlijk moeten, maar zo'n configuratie is, als je die baseert op de drukke maanden, vreselijk duur. Het grootste deel van de tijd betaal je dan voor overcapaciteit.
  3. De services in de cloud hosten. Berekeningen tonen aan dat, als je voor gelijke capaciteit gaat, je net zo duur uit bent. Het grote voordeel is dat je die capaciteit niet altijd hoeft in te zetten. 's Nachts hoef je niet met de volle servercapaciteit te draaien. En wat je niet gebruikt hoef je ook niet te betalen. En daar zit hem nu de winst.
Windows Azure maakt gebruik van virtuele machines (VM's). Zo'n VM kun je zien als een enorm bestand dat zich gedraagt als een harde schijf, waarop ook nog eens een besturingssysteem is geïnstalleerd. Dit bestand wordt vervolgens "ergens" naar een machine gekopieërd en vervolgens opgestart. Je kunt kopieën maken van zo'n bestand om daarvan weer op een andere machine te booten. En zo heb je dan eigenlijk twee servers. Zo'n kopie van VM noemen we een instantie.
Windows Azure heeft een hele bibliotheek met VM's met de laatste Windows versies waaruit gekozen kan worden. Mocht er geen geschikte kandidaat bijzitten, dan heb je altijd nog de mogelijkheid om jouw eigen VM aan te leveren.
De hele handel is aan te sturen via de Azure Portal. Voor websites en services heb je twee opties (afbeelding 1)
  1. Web Sites
  2. Cloud Services
Afbeelding 1. Azure portal
Web Sites leveren een Windows OS met daarop Internet Information Services (IIS), de webserver. Hierop kun je jouw eigen websites draaien, maar ook vooraf gedefinieerde applicaties zoals Joomla, Wordpress en Drupal (zie afbeelding 2). Je kunt deze keuze zien als de traditionele hostingvorm, maar nu gevirtualiseerd. Hierop kun je jouw webapplicatie publiceren via ftp of WebDeploy.


Afbeelding 2. Web Sites opties.
Cloud Services lijken sterk op Web Sites, maar dit is echt, wat men noemt, een PaaS (Platform as a Service) oplossing. Het verschil met Web Sites zit hem in de volgende punten:
  1. Op Cloud Services heb je administratieve rechten. 
  2. Je kunt extra software installeren
  3. Aparte staging omgeving om je bouwsels te testen voordat je ze in de productie-omgeving zet.
  4. Beschikking over remote desktop
  5. Je kunt inhaken op jouw eigen on-premise servers.
In Cloud Services heb je de beschikking over twee soorten omgevingen, één met IIS (Web Role) en één zonder IIS (Worker Role). De laatste kun je goed vergelijken met Windows Services (processen die in de achtergrond draaien), het zijn de werkpaarden.

Er zijn twee manieren om jouw applicatie in de cloud te krijgen:
  1. Uploaden vanuit de Azure Portal
  2. Publishen vanuit Visual Studio.
Wanneer je kiest voor uploaden vanuit de Azure Portal, zul je eerst een Cloud Service moeten aanmaken. Dat gaat erg eenvoudig. Selecteer Cloud Services en klik op die enorme "+" linksonder in beeld of op de "Create a Cloud Service" (afbeelding 3). Bij URL geef je een unieke naam op. Bij "Region or Affinity Group" geef je het datacenter op waar je jouw VM's wilt laten draaien. Kies er een die zo dicht mogelijk bij jouw doelgroep zit. Hieronder een lijst met regions en hun fysieke locatie
  • North-central US (Chicago)
  • South-central US (San Antonio)
  • West US (California)
  • East US (Virginia)
  • East Asia (Hong Kong)
  • South East Asia (Singapore)
  • West Europe (Amsterdam)
  • North Europe (Dublin)
Afbeelding 3. Een nieuwe Cloud Service aanmaken is eenvoudig
Eenmaal aangemaakt, kom je op het overzicht van jouw Cloud Service. Helemaal onder in beeld zit een knop "Upload" waarmee je jouw applicatie kunt uploaden. Het leidt tot het scherm in afbeelding 4. Hier moet de naam van de release worden gegeven en een tweetal bestanden:
Het eerste bestand is een package waarin de hele applicatie verpakt is (.cspkg). Het tweede bestand is een configuratie file (.cscfg) waarin je aangeeft hoeveel instanties (kopieën van VM's) je wilt hebben en welk besturingssysteem moet worden genomen (osFamily). Je hebt de volgende getallen (1 t/m 3):
  1. Windows Server 2008 SP2
  2. Windows Server 2008 R2
  3. Windows Server 2012
Bij iedere family kun je weer een osVersion kiezen. Wanneer je de laatste versie wilt hebben specificeer je gewoon "*". Let ook op het vinkje onderin "Deploy even if one or more roles contain a single instance". Microsoft garandeert een uptime van 99.95%, maar wel op basis van ten minste twee instanties.

Afbeelding 4. Een package uploaden.
Om zo'n .cspkg en .cscfg file te maken kun je het beste de Azure SDK downloaden. Voor .NET sluit deze naadloos aan op Visual Studio 2010 of 2012. Naast Cloud Projecten bevat deze SDK ook een emulator, zodat je de applicatie eerst lokaal kunt testen en niet steeds minuten hoeft te wachten voordat hij in de cloud staat. Bovendien wordt het debuggen een stuk eenvoudiger (afbeelding 5).
Wanneer jouw cloudproject gereed is, klik je op het "Package..." menu en even later worden beide bestanden gegenereerd.

Afbeelding 5. De cloud emulator met een Cloud Service met vier instanties.
Je kunt jouw applicatie ook vanuit Visual Studio uitzetten. Dit gaat dan via Publish.... Hiervoor moet je wel eerst een een speciaal bestand met jouw credentials downloaden. Dit bestand importeer je dan weer in jouw Publish settings (afbeelding 6).


Afbeelding 6. Credentials ophalen en vervolgens importeren
Daarna moet je een storage locatie opgeven waar je package tijdelijk geparkeerd wordt (afbeelding 7) en kun je nog aangeven hoe je wilt uitleveren (afbeelding 8). Na een korte samenvatting kan het uitleveren beginnen (afbeelding 9).


Afbeelding 7. Storage aanmaken om package tijdelijk te parkeren
Afbeelding 8. Hoe gaan we publiceren (Production of Staging, Debug of Release)
Afbeelding 9. Liftoff!!
Wanneer de publicatie geslaagd is, kun je vanuit de Azure Portaal de actuele status van de applicatie bekijken (afbeelding 10). Hierin kun je zien hoe het CPU-gebruik verloopt. Natuurlijk is het ook mogelijk om andere performance indicatoren, zoals geheugengebruik en netwerkbelasting, te monitoren.


Afbeelding 10. Een uitgerolde Web Role.
In afbeelding 11 zie je het aantal instanties (iedere instantie kun je zien als een aparte server) met hun status. Wanneer er eentje corrupt is zie je dat hier meteen terug. Daarnaast kun je met een remote desktop verbinding (via de Connect knop helemaal onderin beeld) naar een specifieke instantie gaan (afbeelding 12). Dat moet je in de uitlevering dan wel aangeven, want standaard kan dat niet.


Afbeelding 11. Het instantie-overzicht van de Web Role.

Afbeelding 12. Een remote desktop verbinding naar een van de instanties.
Tenslotte kun je ook bepalen hoeveel instanties je wilt hebben (afbeelding 13). Met de schuifregelaar kun je dat afregelen. Het duurt nog geen vijf minuten om zo'n opschaling uit te voeren.


Afbeelding 13. Bepaal hier hoeveel instanties je wilt hebben.
Voor BesteProduct was de migratie vrij eenvoudig te realiseren omdat de WCF-services al in IIS gehost werden. Het enige dat hoefde te gebeuren, was een cloud project laten genereren in Visual Studio 2012 (in het contextmenu van het web project "Add Windows Azure Cloud Service Project" selecteren). Na publicatie en het omzetten van de adressen in de web site werkte het meteen. Nu nog logica schrijven om het op- en afschalen te automatiseren, maar daarover de volgende keer meer.

PS.
Wanneer je vanuit "Add Service Reference" in Visual Studio 2012 probeert een WCF-service, die in Azure draait, toe te voegen, kun je tegen de volgende fout aanlopen:

The request failed with HTTP status 400: Bad Request.
Metadata contains a reference that cannot be resolved: 'http://blabla.cloudapp.net//MyService.svc'.
Content Type application/soap+xml; charset=utf-8 was not supported by service

Probeer in dat geval eens het volgende adres:

http://blabla.cloudapp.net//MyService.svc?singleWsdl

Dat singleWsdl (nieuw in .NET 4.5) genereert alles in één wsdl-bestand (anders worden wsdl en xsd's in afzonderlijke bestanden gegenereerd). 
Dit werkte voor mij prima.

Geen opmerkingen:

Een reactie posten