Použití služby Azure Cosmos DB jako poskytovatele stavu relace ASP.NET a ukládání do mezipaměti

PLATÍ PRO: NoSQL

Poskytovatel relace a mezipaměti Azure Cosmos DB umožňuje používat službu Azure Cosmos DB a využívat její funkce nízké latence a globálního škálování k ukládání dat o stavu relace a jako distribuovanou mezipaměť v rámci vaší aplikace.

Co je stav relace?

Stav relace jsou uživatelská data, která sledují uživatele procházející webovou aplikací během časového období ve stejném prohlížeči. Platnost stavu relace vyprší a omezuje se na interakce konkrétního prohlížeče, které se neprosahují napříč prohlížeči. Považuje se za dočasné data, pokud nejsou k dispozici, nenaruší aplikaci. Pokud ale existuje, zrychluje prostředí pro uživatele, protože webová aplikace ho nemusí načítat při každém požadavku prohlížeče pro stejného uživatele.

Často je založený na nějakém mechanismu úložiště, který může být v některých případech externí pro aktuální webový server a umožnit vyrovnávání zatížení požadavků stejného prohlížeče na více webových serverech, aby bylo dosaženo vyšší škálovatelnosti.

Nejjednodušším zprostředkovatelem stavu relace je zprostředkovatel v paměti, který ukládá data pouze do paměti místního webového serveru a vyžaduje, aby aplikace používala směrování požadavků aplikace. Relace prohlížeče tak zůstane na určitém webovém serveru (všechny požadavky na tento prohlížeč musí být vždy na stejném webovém serveru). Poskytovatel funguje dobře v jednoduchých scénářích, ale požadavek na nečinnost může při škálování webových aplikací přinést problémy s vyrovnáváním zatížení.

K dispozici je mnoho externích poskytovatelů úložiště, kteří můžou ukládat data relace způsobem, ke kterému může číst více webových serverů a přistupovat k nich bez nutnosti držet relace a povolit vyšší škálování.

Scénáře stavu relace

Azure Cosmos DB je možné použít jako poskytovatele stavu relace prostřednictvím balíčku rozšíření Microsoft.Extensions.Caching.Cosmos používá sadu .NET SDK služby Azure Cosmos DB a používá kontejner jako efektivní úložiště relací na základě přístupu klíč/hodnota, kde klíč je identifikátor relace.

Po přidání balíčku můžete použít AddCosmosCache jako součást procesu spouštění (služby). AddSession a aplikace. UseSession jsou běžné kroky inicializace vyžadované pro všechny poskytovatele stavu relace:

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

Pokud zadáte databázi a kontejner, ve kterém chcete uložit stav relace, a volitelně je vytvořte, pokud neexistují, pomocí atributu CreateIfNotExists .

Důležité

Pokud místo použití CreateIfNotExistszadáte existující kontejner, ujistěte se, že má povolený čas na živo.

Konfiguraci klienta sady SDK můžete přizpůsobit pomocí CosmosClientBuilder nebo, pokud už vaše aplikace používá CosmosClient pro jiné operace se službou Azure Cosmos DB, můžete ho také vložit do poskytovatele:

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

Potom můžete použít ASP.NET Core relace jako u jiného poskytovatele a použít objekt HttpContext.Session. Nezapomeňte vždy načíst informace o relaci asynchronně podle ASP.NET doporučení.

Scénáře distribuované mezipaměti

Vzhledem k tomu, že zprostředkovatel Azure Cosmos DB implementuje rozhraní IDistributedCache, aby fungovalo jako zprostředkovatel distribuované mezipaměti, je možné ho použít také pro jakoukoli aplikaci, která vyžaduje distribuovanou mezipaměť, nejen pro webové aplikace, které vyžadují výkonného a distribuovaného zprostředkovatele stavu relace.

Distribuované mezipaměti vyžadují konzistenci dat, aby mohly nezávislé instance sdílet data uložená v mezipaměti. Při použití poskytovatele Azure Cosmos DB můžete:

  • Pokud můžete povolit směrování žádostí o aplikaci a nastavit, aby byly požadavky na konkrétní instanci rychlé, použijte účet služby Azure Cosmos DB v konzistenci relací.
  • Používejte účet služby Azure Cosmos DB v omezené nekonzistenci nebo silné konzistenci bez nutnosti zachování požadavků. To poskytuje největší škálování z hlediska distribuce zatížení napříč vašimi instancemi.

Pokud chcete poskytovatele Azure Cosmos DB používat jako distribuovanou mezipaměť, musí být zaregistrovaný v ConfiguredServices pomocí services.AddCosmosCache volání. Jakmile to uděláte, jakýkoli konstruktor v aplikaci může požádat o mezipaměť odkazem IDistributedCache a obdrží instanci vloženou injektáží závislostí , která se má použít:

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

Řešení potíží a diagnostika

PLATÍ PRO: NoSQL

Vzhledem k tomu, že poskytovatel Azure Cosmos DB používá sadu .NET SDK, platí všechny stávající pokyny k výkonu a průvodci odstraňováním potíží , abyste porozuměli potenciálnímu problému. Všimněte si, že existuje jiný způsob, jak získat přístup k diagnostice z podkladových operací služby Azure Cosmos DB, protože je nelze zpřístupnit prostřednictvím rozhraní API IDistributedCache.

Registrace volitelného delegáta diagnostiky vám umožní zaznamenávat a podmíněně protokolovat všechny diagnostiky pro řešení potíží s případy, jako je vysoká latence:

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

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

Další kroky