Udostępnij za pośrednictwem


Użyj Azure Cosmos DB jako dostawcę stanu sesji i buforowania w ASP.NET

DOTYCZY: NoSQL

Dostawca sesji i pamięci podręcznej Azure Cosmos DB umożliwia korzystanie z tej usługi oraz wykorzystanie jej niskich opóźnień i globalnych możliwości skalowania do przechowywania danych stanu sesji oraz jako rozproszoną pamięć podręczną 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óry nie jest rozciągany na inne przeglądarki. Jest to uznawane za dane efemeryczne, jeśli nie są obecne, nie spowoduje przerwania aplikacji. Kiedy jednak istnieje, doświadczenie użytkownika jest szybsze, ponieważ aplikacja internetowa nie musi go pobierać przy każdym żądaniu przeglądarki dla tego samego użytkownika.

Często jest wspierany przez jakiś mechanizm magazynowania, który w niektórych przypadkach może działać poza bieżącym serwerem WWW i umożliwia równoważenie obciążenia żądań z tej samej przeglądarki na wielu serwerach WWW, aby osiągnąć wyższą 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 przypisana do określonego serwera (wszystkie żądania tej przeglądarki muszą zawsze trafiać do tego samego serwera). 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 dostawców zewnętrznej pamięci, 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 przypisania sesji do konkretnych serwerów i umożliwić większą skalowalność.

Scenariusze stanu sesji

Usługa Azure Cosmos DB może być używana jako dostawca stanu sesji za pośrednictwem pakietu rozszerzenia Microsoft.Extensions.Caching.Cosmos, który korzysta z zestawu SDK platformy .NET dla Azure Cosmos DB. Wykorzystuje kontener jako skuteczny magazyn sesji w oparciu o podejście klucz/wartość, w którym klucz jest identyfikatorem sesji.

Po dodaniu pakietu możesz użyć AddCosmosCache jako część procesu uruchamiania (services.AddSession i app.UseSession to typowe kroki inicjalizacji, które są 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 */
}

Gdzie określasz bazę danych i kontener, w którym ma być przechowywany stan sesji, i opcjonalnie tworzysz je, jeśli nie istnieją, przy użyciu atrybutu CreateIfNotExists.

Ważne

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

Konfigurację klienta zestawu SDK można dostosować przy użyciu CosmosClientBuilder lub, jeśli aplikacja już używa CosmosClient dla innych operacji z Azure Cosmos DB, możesz również wstrzyknąć go 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, aby niezależne instancje mogły wspólnie korzystać z przechowywanych danych. 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 trybie Ograniczona nieaktualność lub Silna spójność bez konieczności stosowania przylepności żądań. Zapewnia to największą skalę pod względem rozkładu obciążenia w Twoich wystąpieniach.

Aby użyć dostawcy usługi Azure Cosmos DB jako rozproszonej pamięci podręcznej, należy zarejestrować go w ConfiguredService 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 zapisywanie dowolnej diagnostyki w celu rozwiązywania problemów w przypadkach, np. dużego opóźnienia.

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 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.