استمرارية البيانات وتسلسلها في Durable Functions (Azure Functions)

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

محتويات مركز المهام

تخزن مراكز المهام الحالة الحالية للمثيلات وأي رسائل معلقة:

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

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

للحصول على مثال حول كيفية تمثيل الحالات والرسائل لتقدم التنسيق، راجع مثال تنفيذ مركز المهام.

يعتمد مكان وكيفية تمثيل الحالات والرسائل في التخزين على موفر التخزين. الموفر الافتراضي ل Durable Functions هو Azure Storage، الذي يستمر في البيانات في قوائم الانتظار والجداول والكائنات الثنائية كبيرة الحجم في حساب Azure Storage الذي تحدده.

أنواع البيانات المتسلسلة والدائمة

تعرض القائمة التالية الأنواع المختلفة من البيانات التي سيتم تسلسلها واستمرارها عند استخدام ميزات Durable Functions:

  • جميع الإدخالات والإخراجات من دالات المُنسق، والنشاط، والكيان، بما في ذلك أي معرفات واستثناءات غير معالجة
  • أسماء دالات المُنسق، والنشاط، والكيان
  • أسماء الأحداث الخارجية وحمولاتها
  • حمولات حالة التنسيق المخصصة
  • رسائل إنهاء التنسيق
  • حمولات المؤقت الدائمة
  • عناوين URL لطلب HTTP واستجابته ورؤوسهما وحمولاتهما الدائمة
  • حمولات استدعاء الكيان والإشارات
  • حمولات حالة الكيان

العمل مع البيانات الحساسة

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

بدلاً من ذلك، يتوفر لدى مستخدمي .NET خيار تنفيذ موفري التسلسل المخصص الذين يوفرون التشفير التلقائي. يمكن العثور على مثال للتسلسل المخصص مع التشفير في نموذج GitHub هذا.

إشعار

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

تخصيص التسلسل وإلغاء التسلسل

منطق إنشاء التسلسل الافتراضي

الوظائف الدائمة لـ .NET تستخدم داخليا Json.NET لتسلسل بيانات التنسيق والكيان إلى JSON. إعدادات Json.NET الافتراضية المستخدمة هي:

الإدخالات، والإخراجات، والحالة:

JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.None,
    DateParseHandling = DateParseHandling.None,
}

الاستثناءات:

JsonSerializerSettings
{
    ContractResolver = new ExceptionResolver(),
    TypeNameHandling = TypeNameHandling.Objects,
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
}

اقرأ المزيد من الوثائق التفصيلية حول JsonSerializerSettings هنا.

تخصيص التسلسل باستخدام سمات .NET

أثناء التسلسل، يبحث Json.NET عن سمات مختلفة على الفئات والخصائص التي تتحكم في كيفية تسلسل البيانات وإلغاء تسلسلها من JSON. إذا كنت تملك التعليمات البرمجية المصدر لنوع البيانات الذي تم تمريره إلى واجهات برمجة تطبيقات Durable Functions، فخذ بعين الاعتبار إضافة هذه السمات إلى النوع لتخصيص التسلسل وإلغاء التسلسل.

تخصيص التسلسل باستخدام إدخال التبعية

يمكن لتطبيقات الدالات التي تستهدف .NET وتعمل في وقت تشغيل Functions V3 استخدام إدخال التبعية (DI) لتخصيص كيفية إنشاء تسلسل للبيانات والاستثناءات. يوضح نموذج التعليمات البرمجية التالي كيفية استخدام DI لتجاوز إعدادات التسلسل الافتراضية Json.NET باستخدام تطبيقات مخصصة لواجهات IMessageSerializerSettingsFactory الخدمة و IErrorSerializerSettingsFactory .

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using System.Collections.Generic;

[assembly: FunctionsStartup(typeof(MyApplication.Startup))]
namespace MyApplication
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSingleton<IMessageSerializerSettingsFactory, CustomMessageSerializerSettingsFactory>();
            builder.Services.AddSingleton<IErrorSerializerSettingsFactory, CustomErrorSerializerSettingsFactory>();
        }

        /// <summary>
        /// A factory that provides the serialization for all inputs and outputs for activities and
        /// orchestrations, as well as entity state.
        /// </summary>
        internal class CustomMessageSerializerSettingsFactory : IMessageSerializerSettingsFactory
        {
            public JsonSerializerSettings CreateJsonSerializerSettings()
            {
                // Return your custom JsonSerializerSettings here
            }
        }

        /// <summary>
        /// A factory that provides the serialization for all exceptions thrown by activities
        /// and orchestrations
        /// </summary>
        internal class CustomErrorSerializerSettingsFactory : IErrorSerializerSettingsFactory
        {
            public JsonSerializerSettings CreateJsonSerializerSettings()
            {
                // Return your custom JsonSerializerSettings here
            }
        }
    }
}