使用 Azure Cosmos DB 作為 ASP.NET 工作階段狀態和快取提供者

適用於:NoSQL

Azure Cosmos DB 工作階段和快取提供者可讓您使用 Azure Cosmos DB,並套用其低延遲和全域調整功能,以儲存會話狀態數據,以及作為應用程式中的分散式快取。

什麼是工作階段狀態?

工作階段狀態是使用者資料,可追蹤使用者在一段時間內於同一瀏覽器中瀏覽 Web 應用程式的情形。 會話狀態會過期,而且受限於特定瀏覽器所執行的互動,且不會跨瀏覽器延伸。 如果不存在,它就會被視為暫時數據,因此不會中斷應用程式。 不過,當它存在時,它可讓使用者更快體驗,因為 Web 應用程式不需要在相同使用者的每個瀏覽器要求上擷取它。

它通常受到一些儲存機制的支援,在某些情況下,可能是目前網頁伺服器的外部,並啟用跨多個網頁伺服器對相同瀏覽器的負載平衡要求,以達到更高的延展性。

最簡單的工作階段狀態提供者是記憶體內部提供者,只將資料儲存在本機 Web 伺服器記憶體上,還規定應用程式使用應用程式要求路由。 這使得瀏覽器工作階段綁定至特定的網路伺服器 (該瀏覽器的所有要求必須一律落在相同的 Web 伺服器上)。 此提供者在簡單情節下可行,但在 Web 應用程式縮放時,僵硬的需求可能導致負載平衡問題。

有許多外部儲存體提供者將工作階段資料儲存成可供多個網路伺服器讀取和存取,而不需要工作階段綁定,縮放性更高。

工作階段狀態情節

透過延伸模組套件 Microsoft.Extensions.Caching.Cosmos,Azure Cosmos DB 可以作為工作階段狀態提供者來使用 Azure Cosmos DB .NET SDK,並根據索引鍵/值方法,將容器當作有效的工作階段儲存體,其中索引鍵是工作階段識別碼。

新增此套件之後,您就可以在啟動處理序中使用 AddCosmosCache (services.AddSession 和 app.UseSession 是任何工作階段狀態提供者所需的通用初始化步驟):

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

在其中,您可指定用於儲存工作階段狀態的資料庫和容器,若不存在還可使用 CreateIfNotExists 屬性加以建立。

重要

如果您提供現有的容器,而不是使用 CreateIfNotExists,請確定已啟用存留時間

您可以使用 CosmosClientBuilder 來自訂 SDK 用戶端設定,如果應用程式已使用 CosmosClient 來處理 Azure Cosmos DB 的其他作業,則亦可將其插入提供者中:

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

之後,您可以像任何其他提供者一樣使用 ASP.NET Core 工作階段,並使用 HttpCoNtext.Session 物件。 根據 ASP.NET 建議,切記,一定要試著非同步載入工作階段資訊。

分散式快取情節

由於 Azure Cosmos DB 提供者實作 IDistributedCache 介面作為分散式快取提供者,不只可用於需要高效能和分散式工作階段狀態提供者的 Web 應用程式,還可用於任何需要分散式快取的應用程式。

分散式快取需要資料一致性,才能讓獨立執行個體共用該快取資料。 使用 Azure Cosmos DB 提供者時,您可以:

  • 工作階段一致性下使用 Azure Cosmos DB 帳戶,這是假設您可以啟用應用程式要求路由,並將要求綁定至特定的執行個體。
  • 限定過期或強式一致性下使用 Azure Cosmos DB 帳戶,而不需要綁定要求。 這樣可以竭盡全力將負載分散至執行個體。

若要使用 Azure Cosmos DB 提供者作為分散式快取,必須使用 services.AddCosmosCache 呼叫在 ConfiguredService 中註冊。 完成之後,應用程式中的任何建構函式都可以參考 IDistributedCache 來要求快取,然後會收到相依性插入所插入的可用執行個體:

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

疑難排解和診斷

適用於:NoSQL

由於 Azure Cosmos DB 提供者在底層使用 .NET SDK,所有現有的效能指導方針疑難排解指南都可讓您瞭解任何潛在問題。 請注意,因為無法透過 IDistributedCache API 公開基礎 Azure Cosmos DB 作業,從這些作業存取「診斷」另有獨特方式。

註冊選用診斷委派可讓您擷取和有條件記錄任何診斷,以針對高延遲等任何情況進行疑難排解:

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

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

下一步

  • 如需 Azure Cosmos DB 工作階段和快取提供者的詳細資訊,請參閱 GitHub 上的原始程式碼
  • 探索範例「探索 ASP.NET Core Web 應用程式」來試用 Azure Cosmos DB 工作階段和快取提供者。
  • 深入了解 .NET 中的分散式快取