Programmierkurs C-Sharp: Praxisbeispiel: Load Balancing
Aus Wikibooks
Das Singleton Pattern eignet sich hervorragend, solche Aufgaben wie die Lastverteilung zu übernehmen.
using System;
using System.Collections;
namespace Org.Wikibooks.De.Csharp.Pattern.Singleton
{
class LoadBalancer
{
// Wir nutzen die Effektivität des .NET aus,
// um auf einfachstem Weg zu einer threadsicheren Instanz
// des Loadbalancers zu kommen.
private static readonly LoadBalancer m_Instance = new LoadBalancer();
// Diese Liste nimmt unsere Arbeiter auf,
// an die wir später die Aufgaben verteilen wollen.
private ArrayList m_ServerList = new ArrayList();
// Die einfachste Methode der Implementierung einer Lastverteilung
// ist es, den "Zufall" entscheiden zu lassen, wer wann arbeiten muss.
private Random rand = new Random();
// privater Konstruktor
private LoadBalancer()
{
// Hier füllen wir die Liste der verfügbaren Arbeiter auf.
for (int i = 1; i <= 10; i++)
{
m_ServerList.Add(new Server("Worker_" + i.ToString()));
}
}
public static LoadBalancer GetInstance()
{
return m_Instance;
}
public Server Server
{
get
{
int x = rand.Next(m_ServerList.Count);
return m_ServerList[x] as Server
}
}
}
// Arbeiterklasse
// Die Objekte dieser Klasse führen
// die eigentlichen Arbeiten durch.
internal class Server
{
private string m_Name;
// Konstruktor
public Server(string name)
{
m_Name = name;
}
public void DoSomeWork()
{
// ... Hier wird harte, schweißtreibende Arbeit erledigt ...
}
public string Name
{
get
{
return m_Name;
}
}
}
}
Für ein einfaches Loadbalancing werden zwei Klassen ausgerüstet: eine Klasse namens LoadBalancer, die das Singleton Pattern implementiert und eine Klasse namens Server, deren Instanzen die eigentliche Arbeit ausführen sollen.
Die Verwendung dieses Lastenverteilers ist einfach:
using System;
using System.Collections;
namespace Org.Wikibooks.De.Csharp.Pattern.Singleton
{
public class Foreman
{
LoadBalancer m_Balancer;
public Foreman()
{
// Zuerst holen wir uns die eine Singleton-Instanz,
// die wir bekommen können.
m_Balancer = LoadBalancer.GetInstance();
}
// Hier lassen wir die Arbeiterklassen ihren Job erledigen.
private void BalanceWorkLoad()
{
// Symbolisch reicht es hier,
// uns den Namen nennen zu lassen.
for (int i = 0; i < 10; i++)
{
// Zuerst lassen wir uns den Namen des Arbeiters nennen,
// der den aktuellen Job ausführen soll.
Console.WriteLine(m_Balancer.Server.Name);
// Dann lassen wir ihn ... irgendwas ... erledigen.
m_Balancer.Server.DoSomeWork();
}
}
}
}
Ausgabe (beispielhaft):
Worker_1 Worker_5 Worker_3 Worker_9 Worker_8 Worker_2 Worker_1 Worker_4 Worker_7 Worker_4