Bagikan melalui


Gunakan Azure Cosmos DB sebagai keadaan sesi ASP.NET dan penyedia penembolokan

BERLAKU UNTUK: NoSQL

Sesi Azure Cosmos DB dan penyedia cache memungkinkan Anda untuk menggunakan Azure Cosmos DB dan memanfaatkan latensi rendah dan kemampuan skala global untuk menyimpan data keadaan sesi dan sebagai cache terdistribusi dalam aplikasi Anda.

Apa itu keadaan sesi?

Keadaan sesi adalah data pengguna yang melacak penjelajahan pengguna melalui aplikasi web selama periode waktu tertentu, dalam browser yang sama. Keadaan sesi berakhir, dan itu terbatas pada interaksi yang dimiliki browser tertentu yang tidak meluas di seluruh browser. Hal ini dianggap data singkat, jika tidak hadir tidak akan memutus aplikasi. Namun, ketika ada, keadaan sesi membuat pengalaman lebih cepat bagi pengguna karena aplikasi web tidak perlu mengambilnya pada setiap permintaan browser untuk pengguna yang sama.

Hal ini sering didukung oleh beberapa mekanisme penyimpanan, yang dalam beberapa kasus, berada di luar server web saat ini dan memungkinkan permintaan penyeimbangan muatan dari browser yang sama di beberapa server web untuk mencapai skalabilitas yang lebih tinggi.

Penyedia keadaan sesi yang paling sederhana adalah penyedia dalam memori yang hanya menyimpan data pada memori server web lokal dan mengharuskan aplikasi untuk menggunakan Perutean Permintaan Aplikasi. Hal ini membuat sesi browser lengket ke server web tertentu (semua permintaan untuk browser yang harus selalu mendarat di server web yang sama). Penyedia layanan bekerja dengan baik pada skenario sederhana tetapi persyaratan kelekatan dapat membawa masalah penyeimbangan muatan saat menskalakan aplikasi web.

Ada banyak penyedia penyimpanan eksternal yang tersedia, yang dapat menyimpan data sesi dengan cara yang dapat dibaca dan diakses oleh beberapa server web tanpa memerlukan kelekatan sesi dan memungkinkan skala yang lebih tinggi.

Skenario keadaan sesi

Azure Cosmos DB dapat digunakan sebagai penyedia status sesi melalui paket ekstensi Microsoft.Extensions.Caching.Cosmos menggunakan Azure Cosmos DB .NET SDK, menggunakan Kontainer sebagai penyimpanan sesi yang efektif berdasarkan pendekatan kunci/nilai di mana kuncinya adalah pengidentifikasi sesi.

Setelah paket ditambahkan, Anda dapat menggunakannya AddCosmosCache sebagai bagian dari proses Startup Anda (services.AddSession dan app.UseSession adalah langkah-langkah inisialisasi umum yang diperlukan untuk penyedia keadaan sesi):

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

Di tempat Anda menentukan database dan kontainer yang keadaan sesinya ingin Anda simpan, dan buat tempat tersebut secara manual jika belum ada dengan menggunakan atribut CreateIfNotExists.

Penting

Jika Anda menyediakan kontainer yang ada, dan bukan menggunakan CreateIfNotExists, pastikan bahwa kontainer tersebut sudah diaktifkan waktu aktifnya.

Anda dapat menyesuaikan konfigurasi klien SDK Anda dengan menggunakan CosmosClientBuilder atau jika aplikasi Anda sudah menggunakan CosmosClient untuk operasi lain dengan Azure Cosmos DB, Anda juga dapat memasukkannya ke penyedia:

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

Setelah ini, Anda dapat menggunakan sesi ASP.NET Core seperti dengan penyedia lain dan menggunakan objek HttpContext.Session. Perlu diingat untuk selalu mencoba memuat informasi sesi Anda secara asinkron sesuai dengan rekomendasi ASP.NET.

Skenario cache terdistribusi

Mengingat bahwa penyedia Azure Cosmos DB mengimplementasikan antarmuka IDistributedCache untuk bertindak sebagai penyedia cache terdistribusi, itu juga dapat digunakan untuk aplikasi apa pun yang memerlukan cache terdistribusi, bukan hanya untuk aplikasi web yang memerlukan penyedia status sesi yang berkinerja dan terdistribusi.

Cache terdistribusi memerlukan konsistensi data untuk menyediakan instans independen untuk dapat berbagi data cache tersebut. Saat menggunakan penyedia Azure Cosmos DB, Anda dapat:

  • Gunakan akun Azure Cosmos DB Anda dalam Konsistensi sesi jika Anda dapat mengaktifkan Perutean Permintaan Aplikasi dan membuat permintaan melekat pada instans tertentu.
  • Gunakan akun Azure Cosmos DB Anda di Bounded Staleness atau Konsistensi kuat tanpa memerlukan kelekatan permintaan. Ini memberikan skala terbesar dalam hal distribusi muatan di seluruh instans Anda.

Untuk menggunakan penyedia Azure Cosmos DB sebagai cache terdistribusi, penyedia perlu didaftarkan ConfiguredServicedengan services.AddCosmosCache panggilan. Setelah selesai, setiap konstruktor dalam aplikasi dapat meminta cache dengan referensi IDistributedCache dan konstruktor akan menerima instans yang disuntikkan oleh injeksi dependensi untuk digunakan:

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

Memecahkan dan mendiagnosis masalah

BERLAKU UNTUK: NoSQL

Karena penyedia Azure Cosmos DB menggunakan .NET SDK di bawahnya, semua panduan performa dan panduan pemecahan masalah yang ada berlaku untuk memahami potensi masalah apa pun. Perhatikan, ada cara berbeda untuk mendapatkan akses ke Diagnostik dari operasi Azure Cosmos DB yang mendasarinya karena tidak dapat diekspos melalui API IDistributedCache.

Mendaftarkan delegasi diagnostik opsional akan memungkinkan Anda untuk menangkap dan mencatat diagnostik apa pun secara kondisional untuk memecahkan masalah kasus apa pun seperti latensi tinggi:

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

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

Langkah berikutnya

  • Untuk menemukan rincianl lebih lanjut tentang sesi Azure Cosmos DB dan penyedia cache, lihat kode sumber di GitHub.
  • Cobalah sesi Azure Cosmos DB dan penyedia cache dengan menjelajahi sampel Jelajahi aplikasi web ASP.NET Core.
  • Baca lebih lanjut tentang cache terdistribusi di .NET.