BlogServiceHost.Create()

WCF & Azure - Il blog di Fabio Cozzolino

Recent Posts

Tags

My

Twitter

Community

Archives

Email Notifications

Social Bar Widget

Utilizzare il Windows Azure Content Delivery Network

Windows Azure CDN è un sistema che consente di spostare i contenuti dei blobs in un nodo di “caching” geograficamente localizzato in prossimità dell’utente che consuma quell’informazione. In sostanza invece di accedere al datacenter in cui si trova il dato, ad esempio un’immagine, la richiesta viene servita da un altro datacenter.

Sono due i vantaggi che derivano da questo utilizzo:

  1. Miglioramento delle performance perchè il dato è geograficamente più vicino;
  2. Miglioramento della scalabilità, dato che il carico di richieste non grava più su un unico datacenter, ma viene distribuito sui diversi nodi della rete;

I nodi del CDN sono circa 24 sparsi nel mondo, mentre i datacenter di Azure sono 6. Dal punto di vista dei costi, sono identici a quelli degli Storage Services, il che non cambia nulla in termini di “spesa” mensile.

Ma come possiamo utilizzare il CDN? Dopo averlo attivato, se abbiamo scritto bene il codice per recuperare la stringa di connessione per l’accesso ai Blob Services, utilizzando questa sintassi:

   1: CloudStorageAccount account;
   2: account = CloudStorageAccount.FromConfigurationSetting("StorageConnection");
   3: var client = new CloudBlobClient(account.BlobEndpoint, account.Credentials);

praticamente non dobbiamo far altro che modificare la stringa di connessione, anche con la nostra applicazione in produzione, aggiungendo il BlobEndpoint (BlobEndpoint=http://cdn.mycustomdomain.it) che abbiamo assegnato al CDN:

   1: <?xml version="1.0" encoding="utf-16"?>
   2: <ServiceConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" serviceName="" osFamily="2" osVersion="*" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
   3:   <Role name="MyCloudApp">
   4:     <ConfigurationSettings>
   5:       <Setting name="Storage" value="DefaultEndpointsProtocol=http;AccountName=myaccount;AccountKey=ah7ym..z5u==;BlobEndpoint=http://cdn.mycustomdomain.it" />
   6:     </ConfigurationSettings>
   7:     <!-- other settings -->
   8:   </Role>
   9: </ServiceConfiguration>

Giusto il tempo di aggiornare gli le istanze ed il gioco è fatto Smile

Per approfondimenti: https://www.windowsazure.com/en-us/home/tour/cdn/

Windows Azure SDK e Compute Emulator: gestione degli indirizzi locali

Stimolato da un tweet di oggi del buon Giorgio, ho riesumato questo vecchio post che avevo in coda da un po’ di tempo.

Fino alla versione 1.4, il Compute Emulator, l’ambiente di simulazione locale dell’infrastruttura di Windows Azure, non aveva la gestione del Load Balancer e ogni istanza veniva allocata con lo stesso indirizzo IP (127.0.0.1) ma con porte differenti ed incrementali: 81, 82, 83, e così via…

Dalla versione 1.5, invece, al fine di replicare quanto più possibile l’ambiente di produzione cloud, al Load Balancer viene assegnato, se non diversamente configurato, l’IP 127.0.0.1 con la porta 81 (incrementale se già occupata), mentre ai vari nodi l’indirizzo assegnato sarà diverso, tipicamente l’IP 127.255.0.0, con la porta 82 che questa volta sarà sempre la stessa. Quattro istanze, ad esempio, saranno così suddivise:

  Indirizzo Porta
Load Balancer 127.0.0.1 81
Nodo 1 127.255.0.0 82
Nodo 2 127.255.0.1 82
Nodo 3 127.255.0.3 82
Nodo 4 127.255.0.4 82

Questa nuova modalità genera però alcune problematiche negli applicativi che recuperano l’indirizzo IP utilizzando l’HttpRequest e le proprietà come SERVER_PORT o LOCAL_ADDR. In questo caso, ovviamente, la porta e l’indirizzo sono quelle del nodo su cui l’applicativo è in esecuzione.

Per ovviare al problema è sufficiente recuperare utilizzare le proprietà host e port di Request.Uri per accedere ai relativi headers contenuti nella richiesta HTTP, che conterranno i valori corretti del load balancer proprio perchè è lì che viene inviata la richiesta:

   1: HttpRequest request = HttpContext.Current.Request;
   2: var builder = new UriBuilder(request.Url.Scheme, request.Url.Host, request.Url.Port);

Infine per comodità utilizzo un UriBuilder.

Fabio

Posted: Feb 09 2012, 07:48 PM by Fabio.Cozzolino | with no comments
Filed under:
…a proposito dei prezzi di Windows Azure

Non è molto pubblicizzato, ma leggere che l’Access Control Service è in promozione a costo zero fino al 30 Novembre 2012 (un anno!) è davvero una grande notizia. Dal primo dicembre il prezzo sarà di circa 1,44 € per 100.000 transazioni, quindi non una cifra esorbitante Smile.

Per chi non lo sa, l’Access Control Service è un servizio che permette di realizzare meccanismi di autorizzazione e di Single Sign-On in maniera molto semplice, immediata e facilmente integrabile in applicazioni claim-based.

Maggiori info qui.

Windows Azure: importanti novità

Sono giorni di fermento per la piattaforma Windows Azure. Sono infatti state rilasciate ieri importanti novità. Finalmente qualcosa si muove sul fronte "limiti di utilizzo". E' stato infatti introdotto lo Spending Cap, un limite che permette, a chi sottoscrive un abbonamento trial o attiva il benefit all’interno di MSDN, di definire un tetto di spesa massimo. Se impostato a zero, valore di default, il servizio verrà immediatamente "spento" al suo raggiungimento. Chiaramente si tratta di una feature utile a chi vuole provare Windows Azure senza rischiare di trovarsi addebitate spese che possiamo definire... "non previste" :).

Le novità riguardano anche una maggiore integrazione con l'OSS, tramite il rilascio di nuovi SDK per Java e Node.js, nonchè il supporto per Hadoop, Memcached, Solr/Lucene e MongoDB.

Non entro nel dettaglio di ogni singola feature, Fabio ha già scritto un post ben dettagliato, ma ancora una volta si conferma come la piattaforma Windows Azure sia davvero in continuo movimento ed in perenne evoluzione. Il suo largo utilizzo consente di abbatterne i costi. Come già avvenuto per lo storage qualche mese fa, ora anche SQL Azure beneficia di un ulteriore abbassamento del pricing.

Questo il post ufficiale.

 

Workshop: Future Development Day

Riprendiamo gli appuntamenti DotNetSide con un workshop tutto dedicato alle novità su HTML5, Kinect SDK e soprattutto Windows 8.

http://dotnetside.org/content/FutureDevelopmentDay.aspx

Vi consiglio di non mancare perchè ne vedremo davvero delle belle.

Ci vediamo il 14 ottobre al Rondò Hotel.

Storiainformatica: ad Avellino si parla anche di Cloud Computing

Sabato prossimo, 24 settembre, avrò il piacere di partecipare come ospite ad un evento un po’ particolare: l’History Tech Day - Comunicando, da strumenti di calcolo a strumenti di comunicazione. Organizzato dalla community DotNetCampania e da Microsoft, all’interno di un percorso più ampio che terminerà il 2 ottobre, ha come tema principale la storia dell’informatica.

Ovviamente io parlerò di Cloud Computing e in generale del mondo delle applicazioni distribuite, del modo in cui l’evoluzione informatica cibanner_comunicando_piccolo ha condotti ad avere piattaforme, ad esempio, basate su Windows Azure. Non mancheranno, quindi, cenni storici e case history.

Il “parterre” è d’eccezione dato che interverranno, dopo l’introduzione del prof. Michele DI SANTO, Michele Aponte, Massimo Bonanni, Roberto Freato e Giorgio Garcia-Agreda.

L’evento si terrà ad Avellino a partire dalle 09:00. Per partecipare potete registrarvi qui.

Vi aspettiamo Smile

SQL Azure improvements in Q2 2011

What’s New in SQL Azure Management Portal? (Part II of II)

E’ stata rilasciata ieri una nuova versione di SQL Azure che condivide molte caratteristiche con la nuova versione di SQL Server codename “Denali”. Molti di questi “improvements” sono disponibili attraverso il Management Portal, che è stato in parte rivisitato per consentire una interfaccia più user-friendly.

Tra le novità presenti, che potete leggere qui e qui, quella a mio parere più rilevante riguarda la possibilità di eseguire l’esportazione dei dati direttamente dal Management Portal utilizzando il Blob Storage. La modalità illustrata nel mio libro su Windows Azure da Andrea Benedetti è comunque sempre valida, ma qui si affianca una maggiore semplicità grazie all’interfaccia grafica.

SQLAzureMPImprovements

Potete leggere tutte le novità qui:

Role instances recycled for a certain amount of times during an update or upgrade operation.

Dopo aver aggiornato il mio SDK alla versione 1.4, quasi ogni aggiornamento di un package su Azure mi provoca questo errore:

Role instances recycled for a certain amount of times during an update or upgrade operation. This indicates that the new version of your service or the configuration settings you provided when configuring the service prevent role instances from running. The most likely reason for this is that your code throws an unhandled exception. Please consider fixing your service or changing your configuration settings so that role instances do not throw unhandled exceptions. Then start another update or upgrade operation. Until you start another update or upgrade operation, Windows Azure will continue trying to update your service to the new version or configuration you provided.

Sostanzialmente il kernel di Windows Azure tenta di eseguire l’upgrade diverse volte senza successo. Dal portale non è possibile eseguire più nessun upgrade (i pulsanti sono disabilitati) e quindi abbiamo apperentemente le mani legate.

In realtà l’unica possibilità è quella di provare un Reimage. Ed è proprio quello che ho fatto (con una istanza bloccata…peggio di così Open-mouthed smile). A quel punto, magicamente, il processo di upgrade è terminato correttamente.

Consultandomi con il supporto Windows Azure, mi hanno comunicato che sono al lavoro sull’anomalia ed effettivamente il problema si risolve solo con un re-image. Sarà comunque risolto con la versione 1.5 dell’SDK, attualmente in CTP.

Attenderò impaziente… Nerd smile

Fast boot on Windows 8

I tempi di Windows 8 sembrano….IMPRESSIONANTI!

Fast boot times in Windows 8

Sul blog “Building Windows 8”, Steven Sinofsky illustra cosa è stato fatto e come possiamo intervenire per per modificare il meccanismo di startup.

A quanto pare, si tratta di un sistema ibrido che, differentemente dall’avvio “a freddo”, sfrutta l’ibernazione per quello che riguarda la sola sessione del kernel (session 0), decisamente più piccola rispetto all’intero processo di ibernazione e quindi con conseguenti tempi molto più rapidi.

Si tratta sicuramente di un miglioramento decisamente importante, ma mi sembra di vedere un modo per “aggirare” i problemi di lentezza dell’avvio. Sostanzialmente mi sembra, ma forse mi sbaglio, che siano intervenuti sulle modalità di avvio semplicemente ibernando una fase critica, invece di risolvere i problemi di performance derivanti da un uso intensivo.

Ad ogni modo… la BUILD si avvicina e ne sapremo sicuramente di più!

Sconto su libri in italiano

Come ormai molti di voi ben sapranno, dal 1 settembre entrerà in vigore una discutibilissima legge che vieta a qualsiasi negozio, online o tradizionale, di applicare sconti maggiori del 15% sui libri in lingua italiana. Domani sarà quindi l’ultimo giorno a disposizione per approfittare dei notevoli sconti che molti siti online stanno applicando.

Quindi vi conviene approfittare subito se volete approfittare per acquistare una copia del mio libro su Azure, su amazon (per citarne uno) la trovate al 30%.

Inoltre da qualche tempo è anche disponibile in versione e-book ed acquistabile su bookrepublic.it.

Ovviamente le offerte sono ottime anche per acquistare altri libri, non solo quelli informatici Smile.

Posted: Aug 30 2011, 10:15 PM by Fabio.Cozzolino | with no comments
Filed under: ,
RoleEnvironmentException nella chiamata alla RoleEnvironment.GetLocalResource

In ottica Cloud ogni risorsa (immagine o documento che sia) può e deve essere condivisa tra più istanze, che oggi ci sono e domani non si sa Smile. Per fare questo abbiamo a disposizione blobs e drives.

Talvolta, però, specialmente nella migrazione si applicazioni, possiamo avere la necessità di utilizzare una cartella temporanea per salvare un documento che solo successivamente deve essere elaborato e quindi copiato nel blob. Parliamo quindi di risorse non condivise e con un ciclo di vita davvero limitato.

Windows Azure mette a disposizione il RoleEnvironment.GetLocalResource, un componente che da accesso in lettura/scrittura ad un’apposita area del file system:

   1: LocalResource localResource = RoleEnvironment.GetLocalResource("LocalCache");
   2: _tempFolder = Path.Combine(localResource.RootPath, "temp");
   3: if (!Directory.Exists(_tempFolder))
   4: {
   5:     new DirectoryInfo(localResource.RootPath).CreateSubdirectory("temp");
   6: }

LocalCache è, appunto, un’area opportunamente configurata e ben delimitata nella quale possiamo salvare i nostri files o creare sottocartelle, tutto utilizzando le già ben note classi di System.IO.

LocalCache deve essere necessariamente configurato nel ServiceDefinition.csdef:

   1: <LocalResources>
   2:   <LocalStorage name="LocalCache" cleanOnRoleRecycle="true" />
   3: </LocalResources>

oppure utilizzando il pannello di gestione del Cloud Project:

roleenv

…pena l’eccezione che da il nome a questo post Smile.

Posted: Jul 27 2011, 10:57 PM by Fabio.Cozzolino | with no comments
Filed under:
WCF Express Interop Bindings

Great Job, Man!!! :)

Come annunciato dal mio amico Pablo, sono state rilasciate su codeplex (wcf.codeplex.com) alcune estensioni, frutto della collaborazione tra Microsoft e Tellago, che consentono di utilizzare un set di bindings già pronti per l’interoperabilità con:

  • Oracle WebLogic
  • Oracle Metro
  • IBM WebSphere
  • Apache Axis2

Un lavoro davvero pregevole e che consente, anche attraverso un comodo wizard, di selezionare la piattaforma di interoperabilità. Nei prossimi giorni pubblico qualcosa di più dettagliato al riguardo.

Posted: Jun 14 2011, 08:44 AM by Fabio.Cozzolino | with no comments
Filed under:
Windows 8 - A New Start

Si inizia a parlare della nuova versione di Windows. Questo un primo video disponibile sul canale youtube:

Mooolto tablet-oriented … Smile

DotNetDay – Università del Salento

La nostra amata Puglia è ormai una terra in piena attività. Per questo l’evento che domani si terrà a Lecce rappresenta un nuovo punto di inizio, una nuova realtà che emerge. Noi di dotnetside abbiamo più volte pensato ad organizzare eventi anche fuori dal territorio barese ma, sebbene qualche piccola iniziativa ci sia stata, è sempre mancato l’appoggio sul territorio.

dotnetday

Perciò penso che l’AcademicClub, l’Università del Salento e i Microsoft Student Partners stanno facendo davvero un’ottimo lavoro nel territorio Salentino.

Vi invito a partecipare domani al primo DotNetDay che si terrà a Lecce. Questo un estratto dal sito:

Un’intera giornata dedicata al mondo delle tecnologie Microsoft, col supporto dell’Associazione Freccia, in compagnia del team Microsoft Student Partners e degli Speakers dell'Academic Tour.
Oltre alle tante sessioni tecniche incentrate sulle ultimissime tecnologie, ci sarà la possibilità di toccare con mano i nuovi dispositivi, Windows Phone 7 e Xbox 360 con Kinect, che sfruttano al massimo tutte le tecnologie trattate durante i workshop tecnici. La giornata sarà completata da coffee break e pranzo a buffet, offerti a tutti i partecipanti da Microsoft.

Io, purtroppo, per impegni lavorativi non potrò esserci, e ne sono davvero dispiaciuto. Ma spero di rifarmi al prossimo evento. Smile

http://www.dotnetday.it

Posted: May 24 2011, 11:18 AM by Fabio.Cozzolino | with no comments
Filed under:
Verificare se un Blob esiste

Tra i metodi forniti nativamente dal Windows Azure StorageClient non c’è la possibilità di verificare se un blob è già esistente. Con qualche piccolo trucchetto a base di extension methods si può verificare l’esistenza di un blob generando un traffico davvero minimo sfruttando l’HTTP Method HEAD:

   1: public static class StorageExtensions
   2: {
   3:     public static bool Exist(this CloudBlob blob)
   4:     {
   5:         try
   6:         {
   7:             var request =  BlobRequest.Get(blob.Uri, 60, null, null);
   8:             request.Method = "HEAD";
   9:             blob.ServiceClient.Credentials.SignRequest(request);
  10:             var response = request.GetResponse() as HttpWebResponse;
  11:             return response.StatusCode == HttpStatusCode.OK;
  12:         }
  13:         catch (WebException ex)
  14:         {
  15:             if (ex.Response != null && ex.Response is HttpWebResponse)
  16:             {
  17:                 var response = (HttpWebResponse)ex.Response;
  18:                 return (response.StatusCode == HttpStatusCode.OK);
  19:             }
  20:             return false;
  21:         }
  22:     }
  23: }

Utilizzabile in questo modo:

   1: var container = client.GetContainerReference(containerName);
   2: var blob = container.GetBlobReference(blobName);
   3: if (!blob.Exist())
   4: {
   5:     // ...
   6: }
bye
More Posts « Previous page - Next page »