Verwenden von der Azure Cosmos DB als ASP.NET-Sitzungszustands- und Cacheanbieter

GILT FÜR: NoSQL

Der Azure Cosmos DB-Sitzungs- und Cacheanbieter ermöglicht es Ihnen, die Azure Cosmos DB zu verwenden und deren Funktionen für geringe Latenz und globale Skalierung zum Speichern von Sitzungszustandsdaten und als verteilten Cache innerhalb Ihrer Anwendung zu nutzen.

Was ist der Sitzungszustand?

Beim Sitzungszustand handelt es sich um Benutzerdaten, die das Navigieren eines Benutzers durch eine Webanwendung während eines bestimmten Zeitraums innerhalb desselben Browsers nachführen. Der Sitzungszustand läuft ab und ist auf die Interaktionen eines bestimmten Browsers beschränkt, die sich nicht browserübergreifend auswirken. Die Daten werden als kurzlebig betrachtet. Wenn sie nicht vorhanden sind, wird die Anwendung nicht beeinträchtigt. Wenn sie jedoch vorhanden sind, werden Vorgänge für den Benutzer beschleunigt, da die Webanwendung sie nicht bei jeder Browseranforderung für denselben Benutzer abrufen muss.

Dies wird häufig durch einen Speichermechanismus unterstützt, der sich in einigen Fällen außerhalb des aktuellen Webservers befindet und die Lastenausgleichsanforderungen desselben Browsers über mehrere Webserver ermöglichen kann, um höhere Skalierbarkeit zu erreichen.

Der einfachste Sitzungszustandsanbieter ist der In-Memory-Anbieter, der Daten nur im Arbeitsspeicher des lokalen Webservers speichert und es erforderlich macht, dass die Anwendung das Routing von Anwendungsanforderungen verwendet. Dadurch wird die Browsersitzung an einen bestimmten Webserver gebunden (alle Anforderungen für diesen Browser müssen immer bei demselben Webserver ankommen). Der Anbieter funktioniert gut in einfachen Szenarien, aber die Bindungsanforderung kann beim Skalieren von Webanwendungen zu Problemen mit dem Lastenausgleich führen.

Es gibt viele externe Speicheranbieter. Sie können die Sitzungsdaten so speichern, dass sie von mehreren Webservern gelesen und abgerufen werden können. Das geschieht ohne die Notwendigkeit einer Sitzungsstabilität und ermöglicht eine höhere Skalierung.

Szenarien für den Sitzungszustand

Azure Cosmos DB kann über das Erweiterungspaket Microsoft.Extensions.Caching.Cosmos als Sitzungszustandsanbieter verwendet werden. Dieses Paket nutzt das Azure Cosmos DB .NET SDK, wobei ein Container als effektiver Sitzungsspeicher basierend auf einem Schlüssel-Wert-Ansatz verwendet wird, bei dem der Schlüssel der Sitzungsbezeichner ist.

Nachdem das Paket hinzugefügt wurde, können Sie AddCosmosCache als Teil Ihres Startprozesses verwenden („services.AddSession“ und „app.UseSession“ sind allgemeine Initialisierungsschritte, die für jeden Sitzungszustandsanbieter erforderlich sind):

public void ConfigureServices(IServiceCollection services)
{
  /* Other service configurations */
  services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
  {
      CosmosClientBuilder clientBuilder = new CosmosClientBuilder("myConnectionString")
        .WithApplicationRegion("West US");
      cacheOptions.ContainerName = "myContainer";
      cacheOptions.DatabaseName = "myDatabase";
      cacheOptions.ClientBuilder = clientBuilder;
      /* Creates the container if it does not exist */
      cacheOptions.CreateIfNotExists = true; 
  });

  services.AddSession(options =>
  {
      options.IdleTimeout = TimeSpan.FromSeconds(3600);
      options.Cookie.IsEssential = true;
  });
  /* Other service configurations */
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    /* Other configurations */

    app.UseSession();

    /* app.UseEndpoints and other configurations */
}

Hier geben Sie die Datenbank und den Container zum Speichern des Sitzungsstatus an. Optional können Sie diese mit dem Attribut CreateIfNotExists erstellen, wenn sie noch nicht vorhanden sind.

Wichtig

Wenn Sie einen vorhandenen Container angeben, anstatt CreateIfNotExists zu verwenden, vergewissern Sie sich, dass die Gültigkeitsdauer aktiviert ist.

Sie können Ihre SDK-Clientkonfiguration mit CosmosClientBuilder anpassen. Wenn Ihre Anwendung bereits einen CosmosClient für andere Vorgänge mit Azure Cosmos DB verwendet, können Sie diesen auch in den Anbieter einbeziehen:

services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
{
    cacheOptions.ContainerName = "myContainer";
    cacheOptions.DatabaseName = "myDatabase";
    cacheOptions.CosmosClient = preExistingClient;
    /* Creates the container if it does not exist */
    cacheOptions.CreateIfNotExists = true; 
});

Anschließend können Sie ASP.NET Core-Sitzungen wie bei jedem anderen Anbieter verwenden und das „HttpContext.Session“-Objekt nutzen. Denken Sie daran, Ihre Sitzungsinformationen gemäß den ASP.NET-Empfehlungen nach Möglichkeit immer asynchron zu laden.

Szenarien mit verteilten Caches

Da der Azure Cosmos DB-Anbieter die IDistributedCache-Schnittstelle implementiert, um als Anbieter verteilter Caches zu fungieren, kann er auch für jede Anwendung verwendet werden, die einen verteilten Cache erfordert und nicht lediglich für Webanwendungen, die einen leistungsstarken und verteilten Sitzungszustandsanbieter erfordern.

Verteilte Caches erfordern Datenkonsistenz, um unabhängige Instanzen bereitstellen zu können, die die zwischengespeicherten Daten gemeinsam nutzen können. Die Verwendung des Azure Cosmos DB-Anbieters bietet Ihnen folgende Möglichkeiten:

  • Verwenden Sie Ihr Azure Cosmos DB-Konto in Sitzungskonsistenz, wenn Sie das Routing von Anwendungsanforderungen aktivieren und Anforderungen an eine bestimmte Instanz binden können.
  • Verwenden Sie Ihr Azure Cosmos DB-Konto in Begrenzte Veraltung oder Starke Konsistenz, ohne dass eine Anforderungsbindung erforderlich ist. Dies bietet die größte Skalierung in Bezug auf die Lastverteilung über Ihre Instanzen.

Um den Azure Cosmos DB-Anbieter als verteilten Cache zu verwenden, muss er mit dem Aufruf services.AddCosmosCache in ConfiguredService registriert werden. Sobald dies geschehen ist, kann jeder Konstruktor in der Anwendung den Cache durch den Verweis auf IDistributedCache anfordern und erhält die durch Abhängigkeitsinjektion einbezogene Instanz zur Verwendung:

public class MyBusinessClass
{
    private readonly IDistributedCache cache;

    public MyBusinessClass(IDistributedCache cache)
    {
        this.cache = cache;
    }
    
    public async Task SomeOperationAsync()
    {
        string someCachedValue = await this.cache.GetStringAsync("someKey");
        /* Use the cache */
    }
}

Problembehandlung und Diagnose

GILT FÜR: NoSQL

Da der Azure Cosmos DB-Anbieter das darunter liegende .NET SDK verwendet, gelten alle vorhandenen Leistungsrichtlinien und Leitfäden zur Problembehandlung für das Verstehen potenzieller Probleme. Beachten Sie, dass es eine eigene Methode gibt, um den Zugriff auf die Diagnose der zugrunde liegenden Azure Cosmos DB-Vorgänge zu erhalten, da sie nicht über die IDistributedCache-APIs verfügbar gemacht werden können.

Die Registrierung des optionalen Diagnosedelegaten ermöglicht Ihnen die Erfassung und bedingte Protokollierung von Diagnosen, um Probleme in Fällen wie hoher Latenz zu beheben:

void captureDiagnostics(CosmosDiagnostics diagnostics)
{
    if (diagnostics.GetClientElapsedTime() > SomePredefinedThresholdTime)
    {
        Console.WriteLine(diagnostics.ToString());
    }
}

services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
{
    cacheOptions.DiagnosticsHandler = captureDiagnostics;
    /* other options */
});

Nächste Schritte

  • Weitere Informationen zum Azure Cosmos DB-Sitzungs- und Cacheanbieter finden Sie im Quellcode auf GitHub.
  • Testen Sie den Azure Cosmos DB-Sitzungs- und Cacheanbieter, indem Sie das Beispiel „Untersuchen einer ASP.NET Core-Webanwendung“ durchgehen.
  • Lesen Sie mehr über verteilte Caches in .NET.