استخدم Azure Cosmos DB كموفر حالة جلسة عمل ASP.NET وذاكرة تخزين مؤقت

ينطبق على: NoSQL

تسمح لك جلسة عمل Azure Cosmos DB وموفر ذاكرة التخزين المؤقت باستخدام Azure Cosmos DB وتطبيق إمكانيات زمن الانتقال المنخفض والمقياس العمومي لتخزين بيانات حالة جلسة العمل وكذاكرة تخزين مؤقت موزعة داخل التطبيق الخاص بك.

ما هي حالة جلسة العمل؟

حالة جلسة العمل هي بيانات المستخدم التي تتعقب مستخدماً يستعرض تطبيق ويب خلال فترة زمنية، داخل نفس المستعرض. تنتهي صلاحية حالة الجلسة، وتقتصر على التفاعلات التي يقوم بها مستعرض معين والتي لا تمتد عبر المستعرضات. تعتبر بيانات سريعة الزوال، إذا لم تكن موجودة، فلن تكسر التطبيق. ومع ذلك، عندما يكون موجودا، فإنه يجعل التجربة أسرع للمستخدم لأن تطبيق الويب لا يحتاج إلى إحضاره على كل طلب مستعرض لنفس المستخدم.

غالبا ما يتم دعمها بواسطة بعض آليات التخزين، والتي يمكن أن تكون في بعض الحالات خارجية لخادم الويب الحالي وتمكن طلبات موازنة التحميل لنفس المتصفح عبر خوادم ويب متعددة لتحقيق قابلية توسع أعلى.

أبسط موفر لحالة جلسة العمل حيث يعد موفر الذاكرة الذي يخزن البيانات فقط على ذاكرة خادم الويب المحلي ويتطلب من التطبيق استخدام توجيه طلبات التطبيقات. هذا يجعل جلسة المستعرض مثبتة بخادم ويب معين (يجب أن تهبط جميع الطلبات الخاصة بهذا المستعرض دائماً على نفس خادم الويب). يعمل الموفر بشكل جيد على السيناريوهات البسيطة، لكن متطلبات الثبات يمكن أن تؤدي إلى مشاكل في موازنة الأحمال عند توسيع نطاق تطبيقات الويب.

هناك العديد من موفري التخزين الخارجيين المتاحين، والذين يمكنهم تخزين بيانات الجلسة بطريقة يمكن قراءتها والوصول إليها بواسطة خوادم ويب متعددة دون الحاجة إلى ثبات الجلسة وتمكين سعة أعلى.

سيناريوهات حالة جلسة العمل

يمكن استخدام Azure Cosmos DB كموفر حالة جلسة عمل من خلال حزمة الامتداد Microsoft.Extensions.Caching.Cosmos يستخدم Azure Cosmos DB .NET SDK، باستخدام حاوية كمخزن فعال لجلسة العمل استنادا إلى نهج المفتاح/القيمة حيث يكون المفتاح هو معرف الجلسة.

بمجرد إضافة الحزمة، يمكنك استخدام AddCosmosCache كجزء من عملية بدء التشغيل (الخدمات. إضافة والتطبيق. 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، فتأكد من تمكين مدة البقاء.

يمكنك تخصيص تكوين عميل SDK باستخدام CosmosClientBuilder أو إذا كان التطبيق الخاص بك يستخدم 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 للعمل كموفر ذاكرة تخزين مؤقت موزعة، فإنه يمكن أيضا استخدامه لأي تطبيق يتطلب ذاكرة تخزين مؤقت موزعة، وليس فقط لتطبيقات الويب التي تتطلب موفر حالة جلسة عمل موزعة وأداء.

تتطلب ذاكرات التخزين المؤقت الموزعة اتساق البيانات لتوفير مثيلات مستقلة لتتمكن من مشاركة تلك البيانات المخزنة مؤقتاً. عند استخدام موفر Azure Cosmos DB، يمكنك:

  • استخدم حساب Azure Cosmos DB الخاص بك في تناسق الجلسة إذا كان يمكنك تمكين توجيه طلب التطبيق وجعل الطلبات مثبتة على مثيل معين.
  • استخدم حساب Azure Cosmos DB الخاص بك في Bounded Staleness أو التناسق القوي دون الحاجة إلى ثبات الطلب. يوفر هذا أكبر مقياس من حيث توزيع الحمل عبر مثيلاتك.

لاستخدام موفر Azure Cosmos DB كذاكرة تخزين مؤقت موزعة، يجب تسجيله في ConfiguredServices مع services.AddCosmosCache الاستدعاء. بمجرد الانتهاء من ذلك، يمكن لأي مُنشئ في التطبيق أن يطلب ذاكرة التخزين المؤقت بالرجوع إلى 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 أسفله، فإن جميع إرشادات الأداء الحالية وأدلة استكشاف الأخطاء وإصلاحها تنطبق على فهم أي مشكلة محتملة. ملاحظة، هناك طريقة مميزة للوصول إلى التشخيصات من عمليات Azure Cosmos DB الأساسية لأنه لا يمكن كشفها من خلال واجهات برمجة تطبيقات IDistributedCache.

سيسمح لك تسجيل مفوض التشخيص الاختياري بالتقاط أي تشخيصات وتسجيلها بشكل شرطي لاستكشاف أي حالات مثل زمن الانتقال المرتفع وإصلاحها:

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

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

الخطوات التالية