archive for the 'Cloud' category

08
Apr
09

Improving Entity Framework Performance – und was ist mit dem REST?

image

 

Genau… was passiert mit den ADO.NET Data Services (also dem REST Layer aus dem Hause Microsoft) in dem von Dariusz beschriebenen Szenario:

Dariusz Parys: Improving Entity Framework Performance

Wir nutzen die ADO.NET Data Services aktuell in einem Projekt und ich werde morgen nochmal den Code checken, ob wir auch von so einer Lösung profitieren können. Einen vielversprechenden Ansatz zeigt der Post von Kollegen Shawn Wildermuth auf:

Shawn Wildermuth: ADO.NET Data Services for Multiple Databases?

Das Überschreiben des GetDataSource könnt hier ein Lösung bringen, allerdings muss man schauen, ob sich der Ansatz überhaupt auf eine Web-Anwendung anwenden läßt.

Ciao Marco

28
Mär
09

ADO.NET Data Services – C# Extension Method to the rescue - SaveChangesWithRetry

imageIch habe mich diese Woche wieder mit den Core Funktionen der ADO.NET Data Services beschäftigt. Wir nutzen aktuell das Microsoft Ex-Astoria Projekt, um eine SQL 2008 Datenbank (läuft mit SQL Mirroring) über das Internet an eine Applikation zu binden. An sich eine tolle Sache, aber immer wieder gibt es “neue” Situationen auf die man reagieren muss. In der klassischen Programmierung (C#, SQL über TCP 1433, …) kommt es recht selten vor, dass die Verbindung zur Datenschicht (SqlNativeClient, OLEDB, ODBC, …) unterbrochen wird. In unserem Szenario steckt viel “Cloud” in der Lösung und somit müssen wir mit dem “nicht immer” funktionierenden Internet rechnen. Aktuelle Implementierungen von Microsoft im Cloud-Umfeld, haben für solche Probleme im Code meist die Möglichkeit anzugeben, wie oft der Request wiederholt werden soll. Die ADO.NET Data Services haben so was noch nicht. Also was machen? Wir haben uns für den Weg der Extension Method entschieden. Und so sieht das dann aus (erste Tests waren sehr vielversprechend):

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Data.Services.Client;
   6: using System.Diagnostics;
   7:  
   8: namespace Core.ExtensionMethods
   9: {
  10:     public static class DataServiceContextExtension
  11:     {
  12:         public static DataServiceResponse SaveChangesWithRetry(this DataServiceContext ctx, int retryCount)
  13:         {
  14:             for (int i = 0; i < retryCount; i++)
  15:             {
  16:                 try
  17:                 {
  18:                     return ctx.SaveChanges();
  19:                 }
  20:                 catch (System.Data.Services.Client.DataServiceRequestException ex)
  21:                 {
  22:                     #region Deeper analysis, disabled
  23:                     //foreach (ChangeOperationResponse cor in ex.Response)
  24:                     //{
  25:                     //    if (cor.Descriptor is EntityDescriptor)
  26:                     //    {
  27:                     //        EntityDescriptor ed = (EntityDescriptor)cor.Descriptor;
  28:                     //        Trace.WriteLine(ed.State);
  29:                     //    }
  30:                     //    else if (cor.Descriptor is LinkDescriptor)
  31:                     //    {
  32:                     //        LinkDescriptor ld = (LinkDescriptor)cor.Descriptor;
  33:                     //        Trace.WriteLine(ld.State);
  34:                     //    }
  35:                     //} 
  36:                     #endregion
  37:                     if (i + 1 >= retryCount)
  38:                     {
  39:                         throw;
  40:                     }
  41:                 }
  42:                 catch (Exception ex)
  43:                 {
  44:                     if (i + 1 >= retryCount)
  45:                     {
  46:                         throw;
  47:                     }
  48:                 }
  49:             }
  50:             throw new ApplicationException("Loop must be wrong in retry SaveChanges");
  51:         }
  52:  
  53:         public static DataServiceResponse SaveChangesWithRetry(this DataServiceContext ctx, SaveChangesOptions options, int retryCount)
  54:         {
  55:             for (int i = 0; i < retryCount; i++)
  56:             {
  57:                 try
  58:                 {
  59:                     return ctx.SaveChanges(options);
  60:                 }
  61:                 catch (System.Data.Services.Client.DataServiceRequestException ex)
  62:                 {
  63:                     #region Deeper analysis, disabled
  64:                     //foreach (ChangeOperationResponse cor in ex.Response)
  65:                     //{
  66:                     //    if (cor.Descriptor is EntityDescriptor)
  67:                     //    {
  68:                     //        EntityDescriptor ed = (EntityDescriptor)cor.Descriptor;
  69:                     //        Trace.WriteLine(ed.State);
  70:                     //    }
  71:                     //    else if (cor.Descriptor is LinkDescriptor)
  72:                     //    {
  73:                     //        LinkDescriptor ld = (LinkDescriptor)cor.Descriptor;
  74:                     //        Trace.WriteLine(ld.State);
  75:                     //    }
  76:                     //} 
  77:                     #endregion
  78:                     if (i + 1 >= retryCount)
  79:                     {
  80:                         throw;
  81:                     }
  82:                 }
  83:                 catch (Exception ex)
  84:                 {
  85:                     if (i + 1 >= retryCount)
  86:                     {
  87:                         throw;
  88:                     }
  89:                 }
  90:             }
  91:             throw new ApplicationException("Loop must be wrong in retry SaveChanges Batch");
  92:         }
  93:     }
  94: }

Wir haben das ganze nun in einer Library verpackt. Wenn es dann daran geht, den Code in einem anderen Projekt zu nutzen, das den oben gezeigten Code als Assemly einbindet, dann muss man, wie in der MSDN beschrieben, den Namespace als Using angeben. In unserem Fall also:

   1: using Core.ExtensionMethods;

How to: Implement and Call a Custom Extension Method (C# Programming Guide)

This topic shows how to implement your own extension methods for any type in the .NET Framework Class Library, or any other .NET type that you want to extend. Client code can use your extension methods by adding a reference to the DLL that contains them, and adding a using directive that specifies the namespace in which the extension methods are defined.

Der aufrufende Code sieht also in etwas so aus:

   1:  
   2: var ctxMaster = Ibu.Core.Data.Context.GetMaster(); //Wrapper around setting url and credentials
   3: var query = from ts in ctxMaster.TStuff
   4:                        where ts.StuffId == someGuidkey
   5:                         && ts.IsDeleted == false
   6:                        select ts;
   7:  
   8: var firstStuff = query.First();
   9: firstStuff.IsDeleted = true;
  10: ctxMaster.UpdateObject(firstStuff);
  11:  
  12: //ctxMaster.SaveChanges(); //Old: save and pray
  13: ctxMaster.SaveChangesWithRetry(3); //New: with retry!

Der Post bringt hoffentlich zwei Dinge: 1.) Wie einfach es ist ein Retry auf einem “MS-REST” Context funktioniert und 2.) Was man tun muss, um die Extension Method auch in einem anderen Projekt oder Namespace nutzen zu können.

Ciao Marco

30
Okt
08

Windows Live Mesh nun auch in Deutschland

image Die Mesh Beta ist nun auch für User mit nicht englischen ReginalSettings geöffnet:

http://www.mesh.com/

Bin mal gespannt, ob meine Erwartungen an den SyncDienst in Mesh erfüllt werden.

Ciao Marco

Update: Hier gibt es detailierte Informationen LiveSide

28
Okt
08

PDC 2008 – Day 1

Keynote

Die Keynote hat wirklich Spaß gemacht. Es hatte nicht den Unterhaltungswert wie die Apple-Shows mit Steve Jobs, aber wer hatte schon mit einem “Developers, Developers, …” 2.0 gerechnet :-) Ich dachte der Schwerpunkt würde auf “Windows 7” liegen, aber ich hatte mich geirrt. Ray Ozzie hat das Cloud Operation System “Windows Azure” vorgestellt. Für meinen Interessensschwerpunkt auch viel interessanter als ein neues Desktop OS. Azure bringt endlich Farbe ins Spiel. Bisher ging es im Bereich Cloud Computing nur bei Anbietern wie Amazon (EC2, SimpleDB, …) oder Google (Google Apps, GData, …) voran. Mit dem Service von Microsoft ändert sich das. Es wurde mal wieder alles in einem Topf geworden und mit fehlenden Parts aus dem bestehenden Portfolio ergänzt und mit einigen neuen Tools aufgefüllt. BizTalk.NET hat mit BizTalk an sich nur wenig zu tun, sondern steuert Azure den Enterprise Messaging Bus bei. Teil davon ist auch die Workflow Engine Version 4.0 (WF4). Daten werden in den SQL Services gespeichert. Zukünftig kommen im Datenbereich noch Reporting Services, ETL (also etwas SSIS) und Analysis Services hinzu. Schon heute soll alles durch die beiden OnlineDienste SharePoint und CRM durch Real Life Apps ergänzt werden. “Ganz” neu in der Riege ist die Access Schicht, die Primär aus dem Tool “Geneva” (ehemals “Zermat”) besteht. Geneva hat mich wirklich begeistert und weitere Sessions sind zwingend. Wir selber sind in der Lage ADFS (Active Directory Federation Services) beim Kunden zu implementieren, damit ich meine Credentials außerhalb des Unternehmens in 3rd Party Apps nutzen kann. Die Realität zeigt aber das weder die Administration noch das Application Development so weit ist das wirklich einzusetzen. Mit etwas Zeit und Reife kann Geneva das ändern. Mein Support hat die Idee und ich werde versuchen, einen Case daraus zu generieren. Am Ende hatte ich ein gutes Bild wo die Reise hin gehen soll. Noch ist alles in einem CTP und Microsoft hat alle aufgefordert, aktiv an der weiteren Gestaltung mit zu arbeiten.

Bilder:
Presenter Pult von meinem Platz aus Mein Tweet auf dem Big Screen Ray Ozzie zeigt die Tagcloud der anwesenden Besucher Das ist es also... Azure Ray informiert über Windows Azure Das Azure Platform System Azue demo Azure Identity Information Azure Identity that's Geneva

BB11 – Identity Roadmap for Software + Services
Kim Cameron ist einer der Identity Gurus. Er hat schon verschiedene Events zum Thema Security und auch Card Space gemacht. Die Session hat uns die Microsoft Umgebung vorgestellt, die benötigt wird, um in den Cloud Services, aber nicht nur da benötigt wird, um mit Identitäten und Claims zu arbeiten. Die Claims sind das “wichtigste” beim Arbeiten mit den Cloud Diensten. Ein CRM oder SharePoint in der Cloud zu betreiben und dafür die Unternehmenslogindaten nutzen zu können, ist ein kritischer Faktor für den Erfolg. Je mehr Services hinzukommen, desto schimmern, wenn ich für jeden meine extra Zugangsdaten benötige. Die Idee hinter Geneva ist nicht neu. Sie wird nur von Microsoft durch einen Layer dem Developer zugänglich gemacht. Der Geneva Server ist ein STS (Security Token Service). Am Client erweitert Geneva die CardSpace Umgebung. Die Applikations wird durch Geneva mit dem Server und dem Client verbunden. Durch den Server kann ich zum Beispiel mein eigenes AD als STS publishen. Autorisierte “Clients” (Applikationen als auch weitere STS-Server) können dann damit interagieren. Wer nicht seinen eigene STS aufsetzen will, für den bietet Microsoft den Microsoft Federation Gateway an. In dem MS Gateway stehen gleichzeitig alle LiveID’s als Source zur Verfügung. Eingesetzt werden aktuelle “Standards” wie SAML 2.0, WS-Trust und WS-Federation. Die Authentifizierung funktioniert sehr ähnlich dem Keberos Protokoll, allerdings Internetfähig und mit MetaDaten angereichert.

Bilder:
Identity Technology TimeframesKim Cameron 

TL40 - "Dublin" and .NET Services: Extending On-Premises Applications to the Cloud

Meine Lunch Session reduzierte meine Pause zum Essen auf 30 Minuten… und ich musste einmal quer über das Gelände. Der Raum war brechend voll. Die Lunch Sessions gehen nur 45 Minuten und der Presenter hatte schon angedeutet, dass es ein anstrengendes Unterfangen wird das Thema da hinein zu packen. So war es dann auch ein “Rushen” durch Slides und Codefragmente. Was geblieben ist? .NET Services waren mal BizTalk.NET. Dublin ist ein Teil der .NET Services und soll eine Evolution des Application Servers aus Basis von IIS/WAS sein. Die Demo zeige die Integration in eine SharePoint Site die durch einen WorkFlow mit dem Enterprise Service Bus (ESB) kommuniziert. Der ESB ist das Herz von Dublin. Technisch bildet es ein Publisher/Subscriber Model ab, welches über Messages interagiert. Vielleicht wäre die Session besser gewesen, wenn man nicht versucht hätte das Big Picture in 45 Minuten durchzuprügeln.

Bilder:
Meine Lunch Session mit Dublin IMG_3585 IMG_3588 Dublin und SharePoint IMG_3591

BB42 - Identity: "Geneva" Server and Framework Overview

Zur Session von Kim Cameron sind schon einige Infos aus dieser Session eingeflossen. Ich habe meine ASP.NET 4.0 Ausblick Session sausen lassen, um hier zu sein. Die Präsentation durch Stuart Kwan war es wert. Es hat Spaß gemacht, wie er das Thema vermittelt. Für viele Applikationen, die ich bisher geschrieben habe, gibt es eine Einsatzmöglichkeit für das gezeigte. Das Arbeiten mit Claims sollte einen deutlich höheren Stellenwert für Entwickler haben. Es werden viele Probleme eine Ebene nach oben geschoben und Provider kümmern sich darum, dass die Daten da ankommen, wo sie hin sollen. Es wurde gezeigt wie eine klassische ASP.NET Web Application, die Windows Auth nutzt, per Config, wenigen Zeilen Code und mit Hilfe des Geneva Server (STS) auf Claims umgebaut wurde. Nach der Umstellung ist die Anwendung nicht mehr darauf angewiesen auf einem AD Member Server zu leben. Das Demo hätten wir so in die Cloud schieben können und Geneva und der Server hätten sich um die Authentifizierung gekümmert. Die erzeugten Security Tokens können, wenn die Konfiguration es erlaubt delegiert werden. Der Prozess dahinter funktioniert wie in Kerberos Es ist ebenfalls der Einsatz von Constraint Delegation möglich, welche expliziert die Ressourcen definiert. Geneva ist ebenfalls im CTP Stadium. Microsoft bittet auch hier um Mithilfe und Feedback. Es läuft wohl ein TAP und der RTM für einige Komponenten ist für H2 2009 terminiert.

Meine Frage nach Hochverfügbarkeit wurde mit dem Verweis auf Work in Progress beantwortet, aber es wurde auf klassische Load Balancing Techniken wie NLB verwiesen.

Bilder:
IMG_3595 Pure Begeisterung in der Geneva Session IMG_3597

BB01 - A Lap Around the Azure Services Platform

Nette Session mit ein paar Info’s und Tiefen zum Thema. Die Demo hat gezeigt in welchen Szenarien das ganze einsetzbar ist und warum es eine gute Idee ist es so einzusetzen. Faszinierend ist noch immer das der beliebteste Host für WCF etc eine Console Application ist :-)

Bilder:
Azure Session von Clemens gerettet IMG_3601 IMG_3605 Alle können plötzlich mit Microsoft Cloud oder nicht... die Console ist Demo Projekttyp Nummer 1 Azure Presenter IMG_3611

BB15 SQL Server: Database to Data Platform - Road from Server to Devices to the Cloud

Die Session hat gezeigt, das MS nicht versucht den SQL Server damit abzuschaffen und nur noch eine Cloud DB anzubieten. Es soll das aktuelle Angebot ergänzen. Es wurde aufgezeigt wie die Evolution vom RDBMS zur Database Plattform vollzogen wird. Es ist noch nicht klar, wann es eine “offline” Lösung zum Entwickeln für die Datenbank geben wird. Interessant war zu hören, dass die RDL Files die durch den Report Builder 2.0 erstellt werden, durch Visual Studio 2008 editier bar sind.

Bilder:
Der Andrang ist riesig und Staff winkt Leute nach vorne zu freien Sitzen IMG_3624 IMG_3625 IMG_3627 IMG_3628 Die Datenbank in der Wolke SSDS Demo Architektur Trey Research

SSDS Get Together at Westin Bonaventure

Das Get Together hat zum Glück in meinem Hotel satt gefunden. Die MS SSDS Anwesenden stammen zum großen Teil aus dem aufgelösten WinFS Team ;-) Von dort wurden einige der Techniken übernommen. Ich hatte die Chance mit einem Architekten über eines unserer Projekte zu sprechen. Es wurde deutlich das SSDS deutliche Vorteil zum Beispiel zu ADO.NET Data Services hat. Neben dem kleineren Protokoll und den Features Blobs einzeln ohne den gesamten Datensatz zu holen. Heute Vormittag wurde an alle SSDS Connect User eine Update Mail versandt. Es wurde  neue Features vorgestellt, die auch morgen auf der Keynot bekannt gegeben werden. Die Entwicklungen schreiten mit riesen Schritten voran und die Geschwindigkeit soll wohl auch bei behalten werden. Es war toll, das Team zu treffen und mich mit ihnen auszutauschen.


Zusammenfassung

Ein ziemlich cooler Tag. Die Konferenz ist Perfekt organisiert. Vom Shuttelbus, über die Registrierung bis zum Essen. Es ist einfach alles stimmig. Ich hoffe es geht so weiter.