التزامن في Azure Functions

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

هام

خطة Flex Consumption قيد المعاينة حاليا.

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

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

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

توفر الوظائف طريقتين رئيسيتين لإدارة التزامن:

  • التزامن الثابت: يمكنك تكوين حدود على مستوى المضيف على التزامن، وهي خاصة للمشغلات الفردية. هذا هو سلوك التزامن الافتراضي للدالات.

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

التزامن الثابت

بشكل افتراضي، تدعم معظم المشغلات نموذج تكوين ثابت على مستوى المضيف. في هذا النموذج، يحتوي كل نوع مشغل على حد تزامن لكل مثيل. ومع ذلك، بالنسبة لمعظم المشغلات، يمكنك أيضا طلب تزامن محدد لكل مثيل لنوع المشغل هذا. على سبيل المثال، يوفر مشغل ناقل خدمة Microsoft Azure إعدادا MaxConcurrentCalls و MaxConcurrentSessions في ملف host.json. تتحكم هذه الإعدادات معًا في الحد الأقصى لعدد الرسائل الذي تعالجه كل وظيفة بشكل متزامن على كل مثيل. لدى أنواع المشغلات الأخرى آليات مضمنة لاستدعاءات موازنة التحميل عبر المثيلات. على سبيل المثال: يستخدم كل من محاور الأحداث وAzure Cosmos DB نظامًا يستند إلى تقسيم.

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

تزامن مشغل HTTP

ينطبق فقط على خطة استهلاك Flex (معاينة)

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

حجم المثيل (ميغابايت) التزامن الافتراضي*
2048 16
4096 32

*بالنسبة لتطبيقات Python، يكون تزامن مشغل HTTP الافتراضي لجميع أحجام المثيلات هو 1.

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

إذا كنت بحاجة إلى ضبط تزامن HTTP، يمكنك القيام بذلك باستخدام Azure CLI. لمزيد من المعلومات، راجع تعيين حدود تزامن HTTP.

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

تحديد التزامن الثابت الأمثل

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

من الناحية المثالية، نريد أن يسمح النظام للمثيلات بمعالجة أكبر قدر ممكن من العمل مع الحفاظ على سلامة كل مثيل، وانخفاض زمن الانتقال، وهو ما صُمِمَ التزامن الديناميكي لأجله.

التزامن الديناميكي

توفر الوظائف الآن نموذج تزامن ديناميكي يبسط تكوين التزامن لجميع تطبيقات الوظائف التي تعمل في الخطة نفسها.

إشعار

التزامن الديناميكي مدعوم حاليًا فقط لمشغلات Azure Blob وAzure Queue وService Bus ويتطلب منك استخدام الإصدارات المدرجة في قسم دعم الملحق أدناه.

المزايا

يوفر استخدام التزامن الديناميكي المزايا التالية:

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

تكوين التزامن الديناميكي

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

افتراضيًا، يُعطل التزامن الديناميكي. مع تمكين التزامن الديناميكي، يبدأ التزامن عند 1 لكل وظيفة، ويتم ضبطه حتى قيمة مثلى، يحددها المضيف.

يمكنك تمكين التزامن الديناميكي في تطبيق الوظائف الخاص بك عن طريق إضافة الإعدادات التالية في ملف host.json الخاص بك:

    { 
        "version": "2.0", 
        "concurrency": { 
            "dynamicConcurrencyEnabled": true, 
            "snapshotPersistenceEnabled": true 
        } 
    } 

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

مدير التزامن

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

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

عند تمكين التزامن الديناميكي، سترى قرارات التزامن الديناميكي في سجلاتك. على سبيل المثال: سترى سجلات عند تمكين مُختلف عمليات التقييد، وكلما ضُبط التزامن لأعلى أو لأسفل لكل وظيفة. تتم كتابة هذه السجلات ضمن فئة سجل Host.Concurrency في جدول التتبعات.

دعم التمديد

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

ملحق إصدار ‏‏الوصف
تخزين قائمة الانتظار الإصدار 5.x (ملحق التخزين) يحتوي مشغل تخزين Azure Queue على تكرار حلقي للتحقق من الرسائل الخاصة به. عند استخدام التكوين الثابت، يخضع التزامن BatchSize/NewBatchThreshold لخيارات التكوين. عند استخدام التزامن الديناميكي، يتم تجاهل قيم التكوين هذه. يتم دمج التزامن الديناميكي في حلقة الرسائل، لذلك يتم ضبط عدد الرسائل التي تم إحضارها لكل تكرار ديناميكيًا. عند تمكين التقييدات (يتم تحميل المضيف بشكل زائد)، سيتم إيقاف معالجة الرسائل مؤقتًا حتى يتم تعطيل التقييدات. عندما تُعطل عمليات التقييد، يُسمح للتزامن بالزيادة.
Blob storage الإصدار 5.x (ملحق التخزين) داخليًا، يستخدم مشغل تخزين كائن ثنائي كبير الحجم Azure نفس البنية الأساسية التي يستخدمها مشغل قائمة انتظار Azure. عند الحاجة إلى معالجة الكائنات الثنائية كبيرة الحجم الجديدة/المحدثة، تتم كتابة الرسائل إلى قائمة انتظار التحكم المدارة بواسطة النظام الأساسي، وتتم معالجة قائمة الانتظار هذه باستخدام نفس المنطق المستخدم لـ QueueTrigger. عند تمكين التزامن الديناميكي، ستتم إدارة التزامن لمعالجة قائمة انتظار التحكم هذه ديناميكيًا.
ناقل الخدمة الإصدار 5.x مشغل ناقل الخدمة يدعم حاليًا ثلاثة نماذج تنفيذ. يؤثر التزامن الديناميكي على هذه النماذج كما يلي:

معالجة موضوع/قائمة انتظار الإرسال الفردية: يعالج كل استدعاء لدالتك رسالة واحدة. عند استخدام التكوين الثابت، يحكم MaxConcurrentCalls التزامن خيار التكوين. عند استخدام التزامن الديناميكي، يتم تجاهل قيمة التكوين، ويتم ضبط التزامن بشكل ديناميكي.
معالجة موضوع/قائمة انتظار الإرسال الفردية المستندة إلى جلسة العمل: يعالج كل استدعاء لدالتك رسالة واحدة. حسب عدد الجلسات النشطة لموضوعك/ قائمة انتظارك، يؤجر كل مثيل جلسة واحدة أو أكثر. تُعالج الرسائل في كل جلسة بشكل تسلسلي؛ لضمان الترتيب في الجلسة. عند عدم استخدام التزامن الديناميكي، يحكم الإعداد التزامن MaxConcurrentSessions . مع تمكين التزامن الديناميكي، MaxConcurrentSessions يتم تجاهل عدد جلسات العمل التي يعالجها كل مثيل يتم تعديله ديناميكيا.
معالجة الدفعات: يعالج كل استدعاء لدالتك دفعة من الرسائل، تحكمها الإعدادات MaxMessageCount . ولأن الاستدعاءات الدفعية تسلسلية، فإن تزامن وظيفتك التي يتم تشغيلها بالدفعة دائمًا واحدً، ولا يُطَبق التزامن الديناميكي.

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

لمزيد من المعلومات، راجع الموارد التالية: