Použití Azure Cosmos DB jako ASP.NET relace a poskytovatele mezipaměti

PLATÍ PRO: SQL API

Poskytovatel mezipaměti a relace Azure Cosmos DB umožňuje používat Azure Cosmos DB a využívat její funkce s nízkou latencí a globálním škálování pro ukládání dat stavu relace a jako distribuovanou mezipaměť v rámci vaší aplikace.

Co je stav relace?

Stav relace jsou uživatelská data, která v rámci stejného prohlížeče v určité době sleduje uživatele procházející přes webovou aplikaci. Platnost stavu relace vyprší a je omezená na interakce konkrétního prohlížeče, které se nerozšiřují napříč prohlížeči. Považuje se za dočasné data, pokud nejsou k dispozici, nenaruší aplikaci. Pokud však existuje, zrychluje to prostředí pro uživatele, protože webová aplikace ji nemusí načítat při každém požadavku prohlížeče pro stejného uživatele.

Často se používá mechanismus úložiště, který může být v některých případech externí vzhledem k aktuálnímu webovému serveru a umožňuje požadavky na vyrovnávání zatížení stejného prohlížeče napříč několika webovými servery, aby se dosáhlo vyšší škálovatelnosti.

Nejjednodušším poskytovatelem stavu relací je poskytovatel v paměti, který ukládá data pouze do paměti místního webového serveru a vyžaduje, aby aplikace používá směrování žádostí o aplikaci. Díky tomu je relace prohlížeče přichycená ke konkrétnímu webovému serveru (všechny požadavky na tento prohlížeč musí být vždy na stejném webovém serveru). Poskytovatel dobře funguje v jednoduchých scénářích, ale požadavek na zajištění připravenosti může při škálování webových aplikací způsobit problémy s vyrovnáváním zatížení.

K dispozici je mnoho externích poskytovatelů úložiště, kteří mohou ukládat data relace způsobem, který může číst a přistupovat k nim více webových serverů, aniž by bylo nutné držet relaci a umožnit vyšší škálování.

Scénáře stavu relace

Cosmos Db je možné použít jako zprostředkovatel stavu relace prostřednictvím balíčku rozšíření Microsoft.Extensions.Ukládání do mezipaměti. Cosmos používá sadu Azure Cosmos DB .NET SDKs využitím kontejneru jako efektivního úložiště relací založeného na přístupu typu klíč/hodnota, kde klíč je identifikátor relace.

Po přidání balíčku můžete použít jako součást procesu AddCosmosCache spouštění (služeb). AddSession a app. UseSession jsou běžné kroky inicializace vyžadované pro jakéhokoli zprostředkovatele 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 */
}

Kde zadáte databázi a kontejner, u kterých chcete stav relace uložit, a volitelně je vytvořte, pokud ještě neexistují.

Konfiguraci klienta sady SDK můžete přizpůsobit pomocí nebo pokud vaše aplikace již používá pro jiné operace s Cosmos DB, můžete ji také vložit CosmosClientBuilder CosmosClient do zprostředkovatele:

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 s jiným poskytovatelem a použít objekt HttpContext.Session. Mějte na paměti, že se vždy pokuste načíst informace o relaci asynchronně podle ASP.NET doporučení.

Scénáře distribuované mezipaměti

Vzhledem k tomu, že zprostředkovatel Cosmos DB implementuje rozhraní IDistributedCache,aby vystupoval jako poskytovatel distribuované mezipaměti, může být také použit pro libovolnou aplikaci, která vyžaduje distribuovanou mezipaměť, nejen pro webovou aplikaci, která vyžaduje výkonného a distribuovaného zprostředkovatele stavu relace.

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

  • Svůj účet Cosmos DB použijte v konzistenci relace, pokud můžete povolit směrování žádostí o aplikaci a zajistit, aby se požadavky přitácené ke konkrétní instanci.
  • Svůj účet Cosmos DB používejte v konzistenci Bounded Staleness nebo Strong, aniž by se vyžadovala konzistence požadavků. To poskytuje největší škálování z hlediska distribuce zatížení napříč vašimi instancemi.

Pokud chcete poskytovatele Cosmos DB použít jako distribuovanou mezipaměť, musí být zaregistrovaný ve ConfiguredService volání services.AddCosmosCache . Jakmile to bude hotové, může jakýkoli konstruktor v aplikaci požádat o mezipaměť odkazem a obdrží instanci injektáží závislostí, která IDistributedCache 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: SQL API

Vzhledem k tomu, Cosmos DB používá sadu .NET SDK, všechny stávající pokyny k výkonu a průvodci odstraňováním potíží se vztahují k pochopení potenciálních problémů. Všimněte si, že existuje odlišný způsob, jak získat přístup k diagnostice ze základních operací Cosmos DB, protože je nelze zobrazit prostřednictvím rozhraní API IDistributedCache.

Registrace volitelného diagnostického delegáta vám umožní zachytit a podmíněně protokolovat jakoukoli diagnostiku a řešit potíže 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