Arbeiten mit .NET: Entwurfsmuster/ Creational Patterns/ Load Balancing

Aus Wikibooks

Das Singleton Pattern eignet sich hervorragend, solche Aufgaben wie die Lastverteilung zu übernehmen.


C#-Code:  

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:


C#-Code:  

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