Skalierbare WCF-Anwendungen mit verteiltem Caching

Autor: Iqbal Khan

Nach der explosionsartigen Verbreitung von Webanwendungen zur Bewältigung von stark frequentierten Anwendungen ist die nächste große Welle die serviceorientierte Architektur (SOA). SOA hat die Anwendungsentwicklungs- und Integrationslandschaft verändert. Es ist dazu bestimmt, eine Standardmethode für die Entwicklung extrem skalierbarer Anwendungen zu werden, und Cloud-Computing-Plattformen wie Windows Azure und Windows Communication Foundation (WCF) stellen einen großen Schritt dar, um SOA diesem Ziel näher zu bringen. SOA soll in erster Linie Skalierbarkeit erreichen und so viel Last wie möglich aushalten, um eine verbesserte Agilität und gesteigerte Produktivität zu erreichen.

Allerdings sollte eine echte SOA-Anwendung hinsichtlich der Anwendungsarchitektur leicht skalierbar sein. Es gibt jedoch viele Leistungsengpässe, die behoben werden müssen, um echte Skalierbarkeit zu erreichen.

  • Anwendungsdaten stellen bei weitem die größte Datennutzung in einem WCF-Dienst dar, und ihre Speicherung und ihr Zugriff stellen aufgrund der Latenz, die ein Nebenprodukt des relationalen Datenzugriffs ist, einen großen Engpass bei der Skalierbarkeit dar.
  • Umgebungen mit stark verteilten und unterschiedlichen Datenquellen stellen die größte Herausforderung beim Erreichen der Leistungsziele von SOA dar. Obwohl sich die App-Ebene gut skalieren lässt, bleibt eines der Hauptanliegen einer serviceorientierten Architektur (SOA) die Leistung der teilnehmenden Datendienste.
  • Die Datenebene kann hinsichtlich der Transaktionsverarbeitungskapazität nicht linear skaliert werden, was möglicherweise zu erheblichen Verzögerungen bei der Gesamtantwortzeit führt.
  • Darüber hinaus ist ein SOA-Dienst von anderen Diensten abhängig, die möglicherweise lokal nicht verfügbar sind, sodass ein WAN-Anruf zu einem anderen Dienst möglicherweise zu einem weiteren Engpass wird.
  • Wenn die SOA außerdem bei der Implementierung einer Datenvirtualisierungsschicht verwendet wird, ist die Leistung der Datendienste von entscheidender Bedeutung. In diesem Fall ist die Leistung der Anwendung direkt proportional zur Zeit, die zum Abrufen der zugrunde liegenden Daten benötigt wird. Die Datendienste greifen möglicherweise sowohl auf relationale als auch auf nicht-relationale Daten zu, die oft über mehrere geografisch verteilte Datenzentren verteilt sind, was zu Reaktionslatenz führen und somit die Gesamtleistung der Anwendung beeinträchtigen kann.

Verteilter Cache (NCache) für Service-Skalierbarkeit

Um die Antwortlatenz der gesamten Lösung zu reduzieren, besteht ein umfassender Ansatz darin, ein Hochleistungs-Caching-System zu verwenden, das zusammen mit den Datendiensten oder in der Datenvirtualisierungsschicht verwendet wird. SOA-Dienste befassen sich mit zwei Arten von Daten. Bei dem einen handelt es sich um Dienststatusdaten und beim anderen um Dienstergebnisdaten, die in der Datenbank gespeichert sind. Beides führt zu Skalierbarkeitsengpässen.

Caching kann eine sehr wichtige Rolle bei der Verbesserung der Geschwindigkeit beim Zugriff auf Dienststatus- und Anwendungsdaten spielen und gleichzeitig die Skalierung der Dienste ermöglichen. Caching erreicht dies durch die Minimierung des Datenverkehrs und der Latenz zwischen den Diensten, die den Cache verwenden, und den zugrunde liegenden Datenanbietern. Abbildung 1 zeigt die Verwendung von NCache verteiltes Caching, um dies zu erreichen.

Ultraschall NCache Verteiltes Caching kann den Druck auf die Datenquelle verringern
Abbildung 1: Wie NCache Verteiltes Caching kann den Druck auf die Datenquelle verringern

Anwendungsdaten zwischenspeichern

Ein verteilter Cache wie NCache wird verwendet, um nur eine Teilmenge der Daten in der Datenbank zwischenzuspeichern, basierend auf dem, was der WCF-Dienst in einem kleinen Zeitfenster von einigen Stunden benötigt. Ein verteilter Cache kann einer SOA-Anwendung eine deutliche Steigerung der Skalierbarkeit verleihen, weil:

  • Der verteilte Cache kann aufgrund der verwendeten Architektur skaliert werden.
  • Es sorgt dafür, dass die Dinge auf mehrere Server verteilt sind – und gibt Ihrer SOA-Anwendung dennoch eine logische Ansicht, sodass Sie denken, es handele sich nur um einen Cache. Aber der Cache befindet sich tatsächlich auf mehreren Servern und ermöglicht so eine wirkliche Skalierung des Caches.
  • Wenn Sie verteiltes Caching verwenden, z NCache Zwischen der Serviceschicht und der Datenbank verbessern Sie die Leistung und Skalierbarkeit der Serviceschicht erheblich, da dadurch eine große Anzahl zeitaufwändiger Datenbankfahrten eingespart werden.

Die zu implementierende Grundlogik besteht darin, vor dem Aufrufen der Datenbank zu prüfen, ob der Cache bereits über die Daten verfügt. Wenn ja, nimm es aus dem Cache. Andernfalls rufen Sie die Datenbank auf, um die Daten abzurufen, und legen Sie sie für das nächste Mal im Cache ab. Abbildung 2 zeigt ein Beispiel.

using System.ServiceModel;
using Alachisoft.NCache.Web.Caching;

namespace MyWcfServiceLibrary {
  [ServiceBehavior]
  public class EmployeeService : IEmployeeService {
    static string _sCacheName = "myServiceCache";
    static Cache _sCache = 
      NCache.InitializeCache(_sCacheName);

    public Employee Load(string employeeId) {
// Create a key to lookup in the cache.
      // The key for will be like "Employees:PK:1000".
      string key = "Employee:EmployeeId:" + employeeId;

      Employee employee = (Employee)_sCache[key];
      if (employee == null) {// item not found in the cache. 
        // Therefore, load from database.
        LoadEmployeeFromDb(employee);

        // Now, add to cache for future reference.
       _sCache.Insert(key, employee, null,
          Cache.NoAbsoluteExpiration,
          Cache.NoSlidingExpiration,
          CacheItemPriority.Default);
      }

      // Return a copy of the object since ASP.NET Cache is InProc.
      return employee;
    }
  }
}
Abbildung 2 – Verwendung des WCF-Dienstes NCache - Verteiltes Caching

Wichtige Caching-Funktionen

Bei einem Caching-Design für einen Dienst müssen folgende Aspekte berücksichtigt werden: Wie oft ändern sich die zugrunde liegenden Daten, wie oft müssen die zwischengespeicherten Daten aktualisiert werden, ob die Daten benutzerspezifisch oder anwendungsweit sind, welcher Mechanismus soll verwendet werden, um anzuzeigen, dass der Cache aktualisiert werden muss, Toleranzniveau der Anwendung für fehlerhafte Daten usw. Daher muss eine Caching-Lösung über die erforderlichen Fähigkeiten verfügen, um alle diese Anforderungen zu erfüllen.

Im Folgenden werden einige der wichtigsten Funktionen der skalierbaren Datenverwaltung durch Datendienste mit verteiltem Caching erläutert.

Ablaufende zwischengespeicherte Daten

Mit Abläufen können Sie angeben, wie lange Daten im Cache bleiben sollen, bevor der Cache sie automatisch entfernt. Es gibt zwei Arten von Ablaufdaten, die Sie angeben können NCache: absoluter Zeitablauf und gleitender oder Leerlaufzeitablauf.

Wenn die Daten in Ihrem Cache auch in der Datenbank vorhanden sind, wissen Sie, dass diese Daten in der Datenbank von anderen Benutzern oder Anwendungen geändert werden können, die möglicherweise keinen Zugriff auf Ihren Cache haben. Wenn das passiert, veralten die Daten in Ihrem Cache, was Sie nicht möchten. Wenn Sie abschätzen können, wie lange diese Daten Ihrer Meinung nach sicher im Cache bleiben, können Sie einen absoluten Zeitablauf angeben. Darüber hinaus kann der gleitende Ablauf für sitzungsbasierte Anwendungen, bei denen Sie Sitzungen im verteilten Caching speichern, sehr nützlich sein.

Synchronisieren des Caches mit einer Datenbank

Die Notwendigkeit einer Datenbanksynchronisierung entsteht, weil die Datenbank tatsächlich von mehreren Anwendungen gemeinsam genutzt wird und nicht alle dieser Anwendungen Zugriff auf Ihren Cache haben. Wenn Ihre WCF-Dienstanwendung die einzige ist, die die Datenbank aktualisiert, und auch den Cache problemlos aktualisieren kann, benötigen Sie die Datenbanksynchronisierungsfunktion wahrscheinlich nicht.

Aber in einer realen Umgebung ist das nicht immer der Fall. Anwendungen von Drittanbietern aktualisieren Daten in der Datenbank und Ihr Cache stimmt nicht mehr mit der Datenbank überein. Durch die Synchronisierung Ihres Caches mit der Datenbank wird sichergestellt, dass der Cache diese Datenbankänderungen immer kennt und sich entsprechend aktualisieren kann.

Die Synchronisierung mit der Datenbank bedeutet normalerweise, dass das zugehörige zwischengespeicherte Element aus dem Cache ungültig gemacht wird. Wenn Ihre Anwendung es also das nächste Mal benötigt, muss sie es aus der Datenbank abrufen, da der Cache es nicht enthält.

Verwalten von Datenbeziehungen im Cache

Die meisten Daten stammen aus einer relationalen Datenbank, und selbst wenn sie nicht aus einer relationalen Datenbank stammen, sind sie relationaler Natur. Sie versuchen beispielsweise, ein Kundenobjekt und ein Bestellobjekt zwischenzuspeichern, und beide Objekte hängen zusammen. Ein Kunde kann mehrere Bestellungen haben.

Wenn Sie diese Beziehungen haben, müssen Sie sie in einem Cache verarbeiten können. Das heißt, der Cache sollte über die Beziehung zwischen einem Kunden und einer Bestellung Bescheid wissen. Wenn Sie den Kunden aktualisieren oder aus dem Cache entfernen, möchten Sie möglicherweise, dass der Cache das Bestellobjekt automatisch aus dem Cache entfernt. Dies trägt in vielen Situationen dazu bei, die Datenintegrität aufrechtzuerhalten.

Wenn ein Cache diese Beziehungen nicht verfolgen kann, müssen Sie dies selbst tun – und das macht Ihre Anwendung umständlicher und komplexer.

Zusammenfassung

Daher kann eine SOA-Anwendung nicht effektiv skaliert werden, wenn die von ihr verwendeten Daten in einem Speicher gespeichert werden, der für häufige Transaktionen nicht skalierbar ist. Hier kommt verteiltes Caching zum Einsatz NCache hilft wirklich. In einer Unternehmensumgebung kann eine SOA-basierte Anwendungsumgebung ohne den Einsatz einer echten verteilten Caching-Infrastruktur nicht wirklich skaliert werden. Die herkömmlichen Datenbankserver werden ebenfalls verbessert, aber ohne verteiltes Caching können Dienstanwendungen den explodierenden Anforderungen an Skalierbarkeit in der heutigen komplexen Anwendungsumgebung nicht gerecht werden.


Autor:Iqbal Khan arbeitet für Alachisoft , ein führendes Softwareunternehmen, das Lösungen für verteiltes .NET- und Java-Caching, O/R-Mapping und SharePoint-Speicheroptimierung anbietet. Sie erreichen ihn unter iqbal@alachisoft.com €XNUMX.

© Copyright Alachisoft 2002 - Alle Rechte vorbehalten NCache ist eine eingetragene Marke der Diyatech Corp.