Sdílet prostřednictvím


Použití služby Azure Cosmos DB jako ASP.NET stavu relace a poskytovatele 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 používat její možnosti nízké latence a globálního škálování pro ukládání dat o stavu relace a jako distribuovanou mezipaměť v rámci vaší aplikace.

Co je stav relace?

Stav relace je uživatelská data, která sledují procházení webové aplikace během časového období ve stejném prohlížeči. Platnost stavu relace vyprší a je omezená na interakce konkrétního prohlížeče, který se neprovádí napříč prohlížeči. Jsou považována za dočasné data, pokud nejsou k dispozici, aplikace se neporuší. Pokud ale existuje, zrychluje to pro uživatele prostředí, protože webová aplikace ji nemusí načítat na každém požadavku prohlížeče pro stejného uživatele.

Často se podporuje určitým mechanismem úložiště, který může být v některých případech externí pro aktuální webový server a umožňuje požadavky vyrovnávání zatížení stejného prohlížeče na více webových serverech, aby se dosáhlo vyšší škálovatelnosti.

Nejjednodušším poskytovatelem stavu relace je zprostředkovatel stavu v paměti, který ukládá pouze data do paměti místního webového serveru a vyžaduje, aby aplikace používala směrování žádostí o aplikaci. 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 lepivost 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ě, které můžou ukládat data relace způsobem, který může číst a přistupovat k němu více webových serverů, aniž by vyžadovalo trvalost relace a umožnilo vyšší škálování.

Scénáře stavu relace

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

Po přidání balíčku můžete tento balíček použít AddCosmosCache jako součást procesu po spuštění (služeb). AddSession a app. UseSession jsou běžné kroky inicializace vyžadované pro libovolného zprostředkovatele stavu relace):

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

Tam, kde zadáte databázi a kontejner, který má být stav relace uložen, 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 je povolený čas na spuštění.

Konfiguraci klienta sady SDK můžete přizpůsobit pomocí CosmosClientBuilder klienta nebo pokud vaše aplikace už používá CosmosClient jiné operace se službou Azure Cosmos DB, můžete ji 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 relace ASP.NET Core stejně jako u jakéhokoli jiného zprostředkovatele a použít httpContext.Session objekt. Nezapomeňte vždy načíst informace o relaci asynchronně podle doporučení ASP.NET.

Scénáře distribuované mezipaměti

Vzhledem k tomu, že poskytovatel služby Azure Cosmos DB implementuje rozhraní IDistributedCache tak, aby fungovalo jako poskytovatel distribuované mezipaměti, lze ho použít také pro libovolnou aplikaci, která vyžaduje distribuovanou mezipaměť, nejen pro webové aplikace, které vyžadují výkonného a distribuovaného poskytovatele 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 služby Azure Cosmos DB můžete:

  • Pokud můžete povolit směrování žádostí o aplikaci a vyhovět konkrétní instanci, použijte svůj účet služby Azure Cosmos DB v konzistenci relace.
  • Použijte svůj účet služby Azure Cosmos DB v omezené nestarosti nebo silné konzistenci , aniž byste museli vyžadovat lepivost požadavků. To poskytuje největší škálování z hlediska distribuce zatížení napříč vašimi instancemi.

Pokud chcete jako distribuovanou mezipaměť použít poskytovatele Služby Azure Cosmos DB, musí být zaregistrovaný services.AddCosmosCache ve ConfiguredServicevolání. Po dokončení může jakýkoli konstruktor v aplikaci požádat o mezipaměť odkazováním 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 služby 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íží, které vám pomůžou porozumět potenciálnímu problému. Všimněte si, že existuje jiný způsob, jak získat přístup k diagnostice ze základní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í zachytit a podmíněně protokolovat veškerou diagnostiku 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

  • Další podrobnosti o relaci služby Azure Cosmos DB a poskytovateli mezipaměti najdete ve zdrojovém kódu na GitHubu.
  • Vyzkoušejte si zprostředkovatele relace a mezipaměti Azure Cosmos DB prozkoumáním ukázkové webové aplikace ASP.NET Core.
  • Přečtěte si další informace o distribuovaných mezipamětí v .NET.