WCF Cluster 1.0

Nach einiger Zeit, möchte ich jetzt endlich die erste Version von meinem WCF-Cluster Beispiel vorstellen. Wie man einen einfachen Client bauen kann hatte ich ja schon im vorigen Artikel geschrieben. Ich lade jetzt auch noch einen Command mit hoch, der Pi berechnet um mal ein richtiges Beispiel mit längerer Ausführungsdauer zu haben.

Der ganze Quellcode ist im Download mit drin, deshalb werde ich hier nicht viel reinkopieren. Das Distributor-Gerüst sieht so aus:

public class ComputingPowerDistributor : IComputingPowerDistributor
{
  public void ExecuteCommand(Stream input)
  {
      calculators.ElementAt(calculatorIndex).Value.ProducerExecuteCommand(input);
  }

  public void Connect()
  { 
     calculators[header.ClientAdress] = new ChannelFactory<IPowerProducerClient>(binding, new EndpointAddress(header.ClientAdress)).CreateChannel();
  }

  public void Disconnect()
  {
      calculators.Remove(header.ClientAdress);
  }
}

Die Producer/Calculator können sich an- und  abmelden, jeder Command, der von einem Consumer kommt wird an einen Producer weitergeleitet. Die Adressen und IDs werden im Header von der Nachricht übertragen.

Dann ist die Funktion von Producer/Consumer eigentlich nur noch Fleißarbeit. Einen WCF-Service im Code erstellen und die Methoden vom Distributor aufrufen. Der Producer ist ja immer gleich, deshalb habe ich dafür mal ein UI geschrieben, das im Moment so aussieht:

p1

Der Test-Conumer, der mitkommt sieht so aus:

p2

Der setzt 50 Commands ab, die bei der Pi-Berechnung mitmachen. Diese Commands werden der Reihe nach vom Distributor auf alle Calculator verteilt. Natürlich ist das noch nicht die Endlösung der Lastverteilung, aber zum Testen funktioniert es ganz gut.

Wenn man mit mehreren Computern arbeitet ist es wichtig vorher die Adresse vom Distributor zu ändern (im Moment als localhost), ansonsten sollte alles so funktionieren.

Als erstes muss man den Distributor Host starten, dann die Power Producer und den Consumer, die dll vom Command liegt schon im bin Verzeichnis.

Und hier ist der Link zum Download: Selen.Clustering

WCF Service auf Somee.com

Vor ein paar Monaten habe ich einen kleinen Artikel über Webhosting mit Somee geschrieben und heute einen Kommentar dazu bekommen. Da ich ja nicht besonders viele richtige Kommentare kriege (die traurige Bilanz steht bei 1270 Spam Kommentaren, ein Glück, dass ich jetzt den Spam-Filter hab, sonst wäre wahrscheinlich mein Hotmail Account von den ganzen Benachrichtigungen übergelaufen, und 16 Genehmigten wovon über die Hälfte Trackbacks von mir selber sind), hab ich kein Problem damit mal einen Freitag Abend dafür zu nehmen.

Also, Marek will ein praktisches Beispiel, zu Befehl, los gehts:

Wir melden uns bei somee.com an (s. der verlinkte Artikel von oben).

Wenn alles geklappt hat, müssen wir noch ein paar Parameter für unsere neue Seite einstellen, interessant ist eigentlich nur die Asp.Net Version. Ich nehme jetzt mal an Marek programmiert mit dem Net Framework 4.0, also mach ich das so.image

Dann sind wir soweit und können Visual Studio aufmachen. Ich will Marek nicht gleich mit einer komplizierten WCF-Implementierung über den Haufen rennen also nehmen wir denke ich einfach das Template von Visual Studio für eine WCF Service Application

image

Sollte dann ungefähr so aussehen:

image

Wir lassen den Service also einfach genau so, wie er ist und veröffentlichen ihn auf unserer Website über das Publish Menü von Visual Studio (man kann die Dateien natürlich auch so hochkopieren).

image

Wichtig ist hier die Sache mit der FTP-Adresse, die bei somee immer noch mal ein “www.xxx.somee.com” hintendran braucht, bei mir wäre also die komplette Adresse ftp://selensoft.somee.com/www.selensoft.somee.com/.

Wir schauen nochmal über die Metadaten-Adresse nach ob alles geklappt hat:

image

Und jetzt schreiben wir noch eine kleine Test-Console. Neues Konsolenprojekt, Referenz auf System.ServiceModel und die Service-Dll hinzufügen, App Config hinzufügen.

Die Config ist ganz einfach, ein Endpoint mit unserer Service-Adresse, dem Contract aus der referenzierten Service Dll und dem Binding, was (weil ja Standard) das basicHttpBinding ist:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <system.serviceModel>
 <client>
 <endpoint name="TestService"
 binding="basicHttpBinding"
 address="http://selensoft.somee.com/Service1.svc"
 contract="WcfOnSomee.IService1"/>
 </client>
 </system.serviceModel>
</configuration>

 

Dann können wir diesen Endpoint mit einer einfachen DuplexFactory benutzen (Program Klasse):

static void Main(string[] args)
{
 IService1 proxy = new ChannelFactory<IService1>("TestService").CreateChannel();
 Console.WriteLine(proxy.GetData(123));
 (proxy as ICommunicationObject).Close();
 Console.ReadLine();
}

Und das war´s auch schon, es funktioniert!

image

PS: Wenn es nicht funktioniert oder ich etwas vergessen habe: Unbedingt Kommentar schreiben ;)

Free Hosting ASP.NET und WCF

Für einen .NET Entwickler ist es immer schön auch im Web mit C# hantieren zu können und nicht auf lästige Skripts zurückgreifen zu müssen. Es gibt ja nun Silverlight, aber wenn man nicht möchte, dass der Benutzer ein Plugin installieren muss, oder zum Beispiel einen WCF Service ins Netz stellen möchte, steht man vor einem Problem: Es gibt kaum freie Hoster auf denen ASP.NET läuft. Rein aus Interesse hab ich also mal gegoogelt und auch ein paar Server gefunden, die dann aber alle nach ein paar Monaten Geld haben wollten. Bis ich einen Hoster gefunden hab, der wirklich frei ist: somee.com. Free Hosting ASP.NET und WCF weiterlesen