Udostępnij za pośrednictwem


Używanie usługi Azure Cosmos DB jako dostawcy ASP.NET stanu sesji i buforowania

DOTYCZY: NoSQL

Dostawca sesji i pamięci podręcznej usługi Azure Cosmos DB umożliwia korzystanie z usługi Azure Cosmos DB oraz stosowanie jej małych opóźnień i globalnych możliwości skalowania do przechowywania danych stanu sesji i jako rozproszonej pamięci podręcznej w aplikacji.

Co to jest stan sesji?

Stan sesji to dane użytkownika, które śledzą użytkownika przeglądającego aplikację internetową w danym okresie w tej samej przeglądarce. Stan sesji wygasa i jest ograniczony do interakcji określonej przeglądarki, która nie rozszerza się między przeglądarkami. Jest to uznawane za dane efemeryczne, jeśli nie są obecne, nie spowoduje przerwania aplikacji. Jeśli jednak istnieje, środowisko jest szybsze dla użytkownika, ponieważ aplikacja internetowa nie musi pobierać go na każde żądanie przeglądarki dla tego samego użytkownika.

Często jest on wspierany przez jakiś mechanizm magazynu, który w niektórych przypadkach może być zewnętrzny dla bieżącego serwera internetowego i umożliwia równoważenie obciążenia tej samej przeglądarki na wielu serwerach internetowych, aby osiągnąć większą skalowalność.

Najprostszym dostawcą stanu sesji jest dostawca w pamięci, który przechowuje tylko dane w pamięci lokalnego serwera internetowego i wymaga, aby aplikacja korzystała z routingu żądań aplikacji. Dzięki temu sesja przeglądarki jest lepka do określonego serwera internetowego (wszystkie żądania dla tej przeglądarki muszą zawsze znajdować się na tym samym serwerze internetowym). Dostawca dobrze sprawdza się w prostych scenariuszach, ale wymaganie dotyczące gotowości może powodować problemy z równoważeniem obciążenia podczas skalowania aplikacji internetowych.

Istnieje wiele zewnętrznych dostawców magazynu, którzy mogą przechowywać dane sesji w sposób, który można odczytywać i uzyskiwać do nich dostęp przez wiele serwerów internetowych bez konieczności trzymania sesji i umożliwiać większą skalę.

Scenariusze stanu sesji

Usługa Azure Cosmos DB może służyć jako dostawca stanu sesji za pośrednictwem pakietu rozszerzenia Microsoft.Extensions.Caching.Cosmos używa zestawu SDK platformy .NET usługi Azure Cosmos DB, używając kontenera jako efektywnego magazynu sesji na podstawie podejścia klucza/wartości, w którym klucz jest identyfikatorem sesji.

Po dodaniu pakietu możesz użyć AddCosmosCache go w ramach procesu uruchamiania (usług. DodajSesję i aplikację. UseSession to typowe kroki inicjowania wymagane dla dowolnego dostawcy stanu sesji):

public void ConfigureServices(IServiceCollection services)
{
  /* Other service configurations */
  services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
  {
      CosmosClientBuilder clientBuilder = new CosmosClientBuilder(
        "<nosql-account-endpoint>",
        tokenCredential
      )
        .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 */
}

W przypadku określenia bazy danych i kontenera, który ma być przechowywany i opcjonalnie, utwórz je, jeśli nie istnieją przy użyciu atrybutu CreateIfNotExists .

Ważne

Jeśli podasz istniejący kontener zamiast używać CreateIfNotExistspolecenia , upewnij się, że ma on włączony czas wygaśnięcia.

Konfigurację klienta zestawu SDK można dostosować przy użyciu CosmosClientBuilder elementu lub , jeśli aplikacja jest już używana CosmosClient dla innych operacji w usłudze Azure Cosmos DB, możesz również wstrzyknąć ją do dostawcy:

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

Następnie możesz użyć sesji ASP.NET Core, takich jak w przypadku dowolnego innego dostawcy, i użyć obiektu HttpContext.Session. Pamiętaj, aby zawsze próbować ładować informacje o sesji asynchronicznie zgodnie z zaleceniami ASP.NET.

Scenariusze rozproszonej pamięci podręcznej

Biorąc pod uwagę, że dostawca usługi Azure Cosmos DB implementuje interfejs IDistributedCache do działania jako dostawca rozproszonej pamięci podręcznej, może być również używany dla każdej aplikacji wymagającej rozproszonej pamięci podręcznej, a nie tylko dla aplikacji internetowych, które wymagają wydajnego i rozproszonego dostawcy stanu sesji.

Rozproszone pamięci podręczne wymagają spójności danych w celu zapewnienia niezależnych wystąpień, aby móc udostępniać te buforowane dane. W przypadku korzystania z dostawcy usługi Azure Cosmos DB można wykonywać następujące czynności:

  • Użyj konta usługi Azure Cosmos DB w obszarze Spójność sesji, jeśli możesz włączyć routing żądań aplikacji i wysyłać żądania lepkie do określonego wystąpienia.
  • Użyj konta usługi Azure Cosmos DB w obszarze Powiązana nieaktualność lub Silna spójność bez konieczności stosowania stickiness żądania. Zapewnia to największą skalę pod względem rozkładu obciążenia w wystąpieniach.

Aby użyć dostawcy usługi Azure Cosmos DB jako rozproszonej pamięci podręcznej, należy zarejestrować go w ConfiguredServiceprogramie s za pomocą wywołania services.AddCosmosCache . Po wykonaniu tej czynności każdy konstruktor w aplikacji może poprosić o pamięć podręczną, odwołując IDistributedCache się do niej i otrzyma wystąpienie wstrzyknięte przez iniekcję zależności do użycia:

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 */
    }
}

Rozwiązywanie problemów i diagnozowanie

DOTYCZY: NoSQL

Ponieważ dostawca usługi Azure Cosmos DB korzysta z zestawu .NET SDK poniżej, wszystkie istniejące wytyczne dotyczące wydajności i przewodniki rozwiązywania problemów mają zastosowanie do zrozumienia dowolnego potencjalnego problemu. Należy pamiętać, że istnieje odrębny sposób uzyskiwania dostępu do diagnostyki z podstawowych operacji usługi Azure Cosmos DB, ponieważ nie można ich uwidocznić za pośrednictwem interfejsów API IDistributedCache.

Zarejestrowanie opcjonalnego delegata diagnostyki umożliwi przechwytywanie i warunkowe rejestrowanie dowolnej diagnostyki w celu rozwiązywania problemów z wszelkimi przypadkami, takimi jak duże opóźnienie:

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

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

Następne kroki

  • Aby uzyskać więcej informacji na temat sesji i dostawcy pamięci podręcznej usługi Azure Cosmos DB, zobacz kod źródłowy w witrynie GitHub.
  • Wypróbuj dostawcę sesji i pamięci podręcznej usługi Azure Cosmos DB, eksplorując przykładową aplikację internetową ASP.NET Core.
  • Przeczytaj więcej na temat rozproszonych pamięci podręcznych na platformie .NET.