Arbeiten mit .NET: Entwurfsmuster/ Creational Patterns/ Load Balancing
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