تقنيات التوزيع في Azure Functions
يمكنك استخدام بعض التقنيات المختلفة لتوزيع التعليمات البرمجية لمشروع Azure Functions. توفر هذه المقالة نظرة عامة حول طرق التوزيع المتاحة لك وتوصيات حول أفضل أسلوب لاستخدامه في سيناريوهات مختلفة. كما تقدم قائمة شاملة بالتفاصيل الجوهرية حول تقنيات التوزيع الأساسية.
أساليب التوزيع
تعتمد تقنية التوزيع التي تستخدمها لنشر التعليمات البرمجية إلى تطبيق الوظائف في Azure على احتياجاتك المحددة والنقطة في دورة التطوير. على سبيل المثال، في أثناء التطوير والاختبار، يمكنك التوزيع مباشرةً من أداة التطوير، مثل Visual Studio Code. عندما يكون تطبيقك قيد الإنتاج، فمن المرجح أن تنشر بشكل مستمر من التحكم بالمصادر أو باستخدام مسار نشر تلقائي، والذي يمكن أن يتضمن التحقق من الصحة والاختبار.
يصف الجدول التالي أساليب النشر المتوفرة لمشروع التعليمات البرمجية.
نوع التوزيع | الأساليب | الأفضل بالنسبة إلى... |
---|---|---|
مستند إلى الأدوات | • Azure CLI • نشر Visual Studio Code • نشر Visual Studio • نشر الأدوات الأساسية |
عمليات التوزيع أثناء التطوير والنشرات المرتجلة الأخرى. نشر التعليمات البرمجية عند الطلب باستخدام أدوات التطوير المحلية. |
خدمة مُدارة في التطبيق | • مركز التوزيع (CI/CD) • توزيعات الحاوية |
التوزيع المستمر (CI/CD) من عنصر التحكم في المصادر أو من سجل حاوية. تتم إدارة عمليات التوزيع بواسطة النظام الأساسي App Service (Kudu). |
مسارات خارجية | • البنية الأساسية لبرنامج ربط العمليات التجارية في Azure • إجراءات GitHub |
مسارات الإنتاج التي تتضمن التحقق من الصحة والاختبار والإجراءات الأخرى التي يجب تشغيلها كجزء من توزيع تلقائي. تتم إدارة عمليات التوزيع بواسطة المسار. |
يجب أن تستخدم عمليات التوزيع المحددة أفضل تقنية استنادا إلى السيناريو المحدد. تستند العديد من أساليب التوزيع إلى توزيع zip، وهو ما يوصى به للتوزيع.
مدى توافر تقنية التوزيع
تعتمد طريقة التوزيع أيضا على خطة الاستضافة ونظام التشغيل الذي تقوم بتشغيل تطبيق الوظائف عليه.
حاليا، تقدم Functions خمسة خيارات لاستضافة تطبيقات الوظائف الخاصة بك:
كل خطة لها سلوكيات مختلفة. لا تتوفر جميع تقنيات النشر لكل خطة استضافة ونظام تشغيل. يوفر هذا المخطط معلومات حول تقنيات النشر المدعومة:
تقنية التوزيع | استهلاك فليكس | الاستهلاك | بالقسط المريح | مخصصة | التطبيقات المتعلقة بالحاوية |
---|---|---|---|---|---|
توزيع واحد | ✔ | ||||
توزيع Zip | ✔ | ✔ | ✔ | ||
عنوان URLللحزمة الخارجية 1 | ✔ | ✔ | ✔ | ||
حاوية Docker | Linux فقط | Linux فقط | Linux فقط | ✔ | |
التحكم بالمصادر | Windows فقط | ✔ | ✔ | ||
Git1 المحلي | Windows فقط | ✔ | ✔ | ||
FTPS1 | Windows فقط | ✔ | ✔ | ||
التحريرفي المدخل 2 | ✔ | ✔ | ✔ |
1 لا يوصى بتقنيات النشر التي تتطلب منك مزامنة المشغلات يدويا.
2 يتم تعطيل التحرير في المدخل عند نشر التعليمات البرمجية إلى تطبيق الوظائف من خارج المدخل. لمزيد من المعلومات، بما في ذلك تفاصيل دعم اللغة للتحرير في المدخل، راجع تفاصيل دعم اللغة.
المفاهيم الرئيسية
تُعد بعض المفاهيم الأساسية مهمة لفهم كيفية عمل عمليات التوزيع إلى Azure Functions.
مزامنة المشغّل
عند تغيير أي من المشغلات، يجب أن تعلم البنية الأساسية في Functions بالتغييرات. تحدث المزامنة تلقائيًا للعديد من تقنيات التوزيع. ومع ذلك، في بعض الحالات، يجب عليك مزامنة المشغلات يدويًا.
يجب مزامنة المشغلات يدويا عند استخدام خيارات النشر هذه:
يمكنك مزامنة المشغلات بإحدى الطرق التالية:
إعادة تشغيل تطبيق الوظائف في مدخل Microsoft Azure.
az rest
استخدم الأمر لإرسال طلب HTTP POST الذي يستدعيsyncfunctiontriggers
واجهة برمجة التطبيقات، كما في هذا المثال:az rest --method post --url https://management.azure.com/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.Web/sites/<APP_NAME>/syncfunctiontriggers?api-version=2016-08-01
عند نشر إصدار محدث من حزمة النشر والحفاظ على نفس عنوان URL للحزمة الخارجية، تحتاج إلى إعادة تشغيل تطبيق الوظائف يدويا. يشير هذا إلى المضيف أنه يجب عليه مزامنة التحديثات وإعادة توزيعها من نفس عنوان URL للحزمة. يقوم مضيف الوظائف أيضا بإجراء مزامنة مشغل الخلفية بعد بدء تشغيل التطبيق. ومع ذلك، بالنسبة لخطط استضافة Consumption و Elastic Premium، يجب عليك أيضا مزامنة المشغلات يدويا في هذه السيناريوهات:
- عمليات التوزيع باستخدام عنوان URL لحزمة خارجية مع قوالب ARM أو Terraform.
- عند تحديث حزمة النشر في نفس عنوان URL للحزمة الخارجية.
بناء بعيد
يمكنك طلب Azure Functions لتنفيذ بنية عن بعد لمشروع التعليمات البرمجية أثناء النشر. في هذه السيناريوهات، يجب طلب إنشاء عن بعد بدلا من الإنشاء محليا:
- تقوم بنشر تطبيق إلى تطبيق وظائف يستند إلى Linux تم تطويره على كمبيوتر Windows. هذا هو الحال عادة لتطوير تطبيق Python. يمكنك في النهاية استخدام مكتبات غير صحيحة عند إنشاء حزمة التوزيع محليا على Windows.
- يحتوي مشروعك على تبعيات على فهرس حزمة مخصص.
- تريد تقليل حجم حزمة التوزيع الخاصة بك.
تعتمد كيفية طلب إنشاء عن بعد على ما إذا كان تطبيقك يعمل في Azure على Windows أو Linux.
تحتوي جميع تطبيقات الوظائف التي تعمل على Windows على تطبيق إدارة صغير، scm
وهو الموقع الذي توفره Kudu. يعالج هذا الموقع الكثير من عمليات التوزيع ومنطق الإنشاء في Azure Functions.
عند توزيع تطبيق على Windows، يتم تشغيل أوامر خاصة باللغة، مثل dotnet restore
(C#) أو npm install
(JavaScript).
تنطبق الاعتبارات التالية عند استخدام البنيات البعيدة أثناء النشر:
- يتم دعم الإصدارات عن بعد لتطبيقات الوظائف التي تعمل على Linux في خطة الاستهلاك. ومع ذلك، فإن خيارات النشر محدودة لهذه التطبيقات لأنه ليس لديها
scm
موقع (Kudu). - تحتوي
scm
تطبيقات الوظائف التي تعمل على Linux في خطة Premium أو في خطة مخصصة (خدمة التطبيقات) على موقع (Kudu)، ولكنها محدودة مقارنة ب Windows. - لا يتم تنفيذ الإصدارات البعيدة عندما يستخدم تطبيق التشغيل من الحزمة. لمعرفة كيفية استخدام الإنشاء عن بعد في هذه الحالات، راجع توزيع Zip.
- قد تواجه مشكلات في الإنشاء عن بعد عند إنشاء تطبيقك قبل توفير الميزة (1 أغسطس 2019). بالنسبة للتطبيقات القديمة، إما إنشاء تطبيق دالة جديد أو تشغيل
az functionapp update --resource-group <RESOURCE_GROUP_NAME> --name <APP_NAME>
لتحديث تطبيق الوظائف. قد يتطلب الأمر إجراء محاولتين للنجاح.
تخزين محتوى التطبيق
تخزن أساليب النشر المستندة إلى الحزمة الحزمة في حساب التخزين المقترن بتطبيق الوظائف، والذي تم تعريفه في إعداد AzureWebJobsStorage . عند توفرها، تحاول تطبيقات خطة Consumption و Elastic Premium استخدام مشاركة محتوى Azure Files من هذا الحساب، ولكن يمكنك أيضا الاحتفاظ بالحزمة في موقع آخر. بدلا من ذلك، تستخدم تطبيقات خطة Flex Consumption حاوية تخزين في حساب التخزين الافتراضي، إلا إذا قمت بتكوين حساب تخزين مختلف لاستخدامه للنشر. لمزيد من المعلومات، راجع التفاصيل في مكان تخزين محتوى التطبيق في كل تقنية نشر مشمولة في القسم التالي.
هام
يتم استخدام حساب التخزين لتخزين بيانات التطبيق المهمة، بما في ذلك أحيانا التعليمات البرمجية للتطبيق نفسه. يجب تقييد الوصول من التطبيقات والمستخدمين الآخرين إلى حساب التخزين.
تفاصيل تقنية التوزيع
تتوفر أساليب التوزيع التالية في Azure Functions. راجع جدول توفر تقنية التوزيع لتحديد التقنيات التي تدعمها كل خطة استضافة.
توزيع واحد
توزيع واحد هو تقنية التوزيع الوحيدة المدعومة للتطبيقات على خطة Flex Consumption. النتيجة النهائية هي حزمة .zip جاهزة للتشغيل يعمل عليها تطبيق الوظائف.
كيفية استخدامه: النشر باستخدام ميزة نشر Visual Studio Code ، أو من سطر الأوامر باستخدام Azure Functions Core Tools أو Azure CLI. تستفيد مهمة Azure Dev Ops وGitHub Action بشكل مماثل من توزيع واحد عندما يكتشفان أنه يتم نشر تطبيق Flex Consumption فيه.
عند إنشاء تطبيق Flex Consumption، ستحتاج إلى تحديد حاوية تخزين نشر (blob) بالإضافة إلى طريقة مصادقة له. بشكل افتراضي، يتم استخدام نفس حساب التخزين مثل
AzureWebJobsStorage
الاتصال، مع سلسلة الاتصال كطريقة المصادقة. وبالتالي، يتم تكوين إعدادات النشر أثناء وقت إنشاء التطبيق دون أي حاجة إلى إعدادات التطبيق.
متى يتم استخدامه: توزيع واحد هو تقنية التوزيع الوحيدة المتاحة لتطبيقات الوظائف التي تعمل على خطة Flex Consumption.
حيث يتم تخزين محتوى التطبيق: عند إنشاء تطبيق دالة Flex Consumption، يمكنك تحديد حاوية تخزين توزيع. هذه حاوية كائن ثنائي كبير الحجم حيث سيقوم النظام الأساسي بتحميل محتوى التطبيق الذي قمت بنشره. لتغيير الموقع، يمكنك زيارة شفرة إعدادات النشر في مدخل Microsoft Azure أو استخدام Azure CLI.
توزيع Zip
توزيع Zip هو تقنية التوزيع الافتراضية والموصى بها لتطبيقات الوظائف على خطط Consumption و Elastic Premium و App Service (Dedicated). النتيجة النهائية هي حزمة .zip جاهزة للتشغيل يعمل عليها تطبيق الوظائف. وهو يختلف عن عنوان URL للحزمة الخارجية من حيث أن النظام الأساسي لدينا مسؤول عن إنشاء محتوى التطبيق وتخزينه عن بعد.
كيفية استخدامه: انشر باستخدام أداة العميل المفضلة لديك: Visual Studio Code أو Visual Studio أو من سطر الأوامر باستخدام Azure Functions Core Tools أو Azure CLI. تستفيد مهمة Azure Dev Ops وGitHub Action بشكل مماثل من توزيع zip.
عند التوزيع باستخدام توزيع zip، يمكنك تعيين التطبيق للتشغيل من الحزمة. للتشغيل من الحزمة، عيّن قيمة إعدادات التطبيق
WEBSITE_RUN_FROM_PACKAGE
على1
. نوصي بتوزيع zip. فهو يعمل على إنتاج أوقات تحميل أسرع للتطبيقات، وهو الإعداد الافتراضي لـ VS Code وVisual Studio وAzure CLI.
متى يتم استخدامه: توزيع Zip هو تقنية النشر الافتراضية والموصى بها لتطبيقات الوظائف على خطط Windows Consumption وWindows وLinux Elastic Premium وWindows وLinux App Service (مخصص).
حيث يتم تخزين محتوى التطبيق: يتم تخزين محتوى التطبيق من نشر zip بشكل افتراضي على نظام الملفات، والذي قد يتم دعمه بواسطة Azure Files من حساب التخزين المحدد عند إنشاء تطبيق الوظائف. في Linux Consumption، يستمر محتوى التطبيق بدلا من ذلك على كائن ثنائي كبير الحجم في حساب التخزين المحدد بواسطة
AzureWebJobsStorage
إعداد التطبيق، وسيأخذ إعدادWEBSITE_RUN_FROM_PACKAGE
التطبيق قيمة عنوان URL للكائن الثنائي كبير الحجم.
عنوان URL خارجي للحزمة
عنوان URL للحزمة الخارجية هو خيار إذا كنت تريد التحكم يدويا في كيفية تنفيذ عمليات النشر. تتحمل مسؤولية تحميل حزمة .zip جاهزة للتشغيل تحتوي على محتوى التطبيق المضمن إلى تخزين كائن ثنائي كبير الحجم والإشارة إلى عنوان URL الخارجي هذا كإعداد تطبيق على تطبيق الوظائف. كلما تم إعادة تشغيل التطبيق، فإنه يجلب الحزمة، ويحملها، ويعمل في وضع تشغيل من الحزمة .
كيفية استخدامه: أضِف
WEBSITE_RUN_FROM_PACKAGE
إلى إعدادات التطبيق. يجب أن تكون قيمة هذا الإعداد عنوان URL للكائن الثنائي كبير الحجم يشير إلى موقع الحزمة المحددة التي تريد تشغيل التطبيق الخاص بك. يمكنك إضافة إعدادات إما في المدخل أو باستخدام Azure CLI.إذا كنت تستخدم Azure Blob Storage، يمكن لتطبيق Function الوصول إلى الحاوية إما باستخدام اتصال مدار يستند إلى الهوية أو بتوقيع وصول مشترك (SAS). يؤثر الخيار الذي تختاره على نوع عنوان URL الذي تستخدمه كقيمة WEBSITE_RUN_FROM_PACKAGE. يوصى بالهوية المدارة للأمان العام ولأن الرموز المميزة ل SAS تنتهي صلاحيتها ويجب الاحتفاظ بها يدويا.
كلما قمت بنشر ملف الحزمة الذي يشير إليه تطبيق دالة، يجب عليك مزامنة المشغلات يدويا، بما في ذلك النشر الأولي. عند تغيير محتويات ملف الحزمة وليس عنوان URL نفسه، يجب أيضا إعادة تشغيل تطبيق الوظائف لمزامنة المشغلات. راجع دليل الكيفية الخاص بنا حول تكوين تقنية النشر هذه.
متى يتم استخدامه: عنوان URL للحزمة الخارجية هو أسلوب النشر الوحيد المدعوم للتطبيقات التي تعمل على خطة استهلاك Linux عندما لا تريد حدوث إصدار عن بعد. هذه الطريقة هي أيضا تقنية النشر الموصى بها عند إنشاء تطبيقك بدون ملفات Azure. بالنسبة للتطبيقات القابلة للتطوير التي تعمل على Linux، يجب عليك بدلا من ذلك التفكير في استضافة خطة استهلاك Flex.
مكان تخزين محتوى التطبيق: أنت مسؤول عن تحميل محتوى التطبيق إلى تخزين كائن ثنائي كبير الحجم. يمكنك استخدام أي حساب تخزين كائن ثنائي كبير الحجم، على الرغم من أنه يوصى باستخدام Azure Blob Storage.
حاوية Docker
يمكنك نشر تطبيق دالة يعمل في حاوية Linux.
كيفية استخدامه:أنشئ وظائفك في حاوية Linux ثم انشر الحاوية إلى خطة Premium أو Dedicated في Azure Functions أو مضيف حاوية آخر. استخدم Azure Functions Core Tools لإنشاء Dockerfile مخصص لمشروعك الذي تستخدمه لإنشاء تطبيق دالة في حاوية. يمكنك استخدام الحاوية في عمليات التوزيع التالية:
- النشر إلى موارد Azure Functions التي تقوم بإنشائها في مدخل Microsoft Azure. لمزيد من المعلومات، راجع إنشاء مدخل Azure باستخدام الحاويات.
- انشر إلى موارد Azure Functions التي تقوم بإنشائها من سطر الأوامر. يتطلب إما خطة Premium أو مخصصة (App Service). لمعرفة كيفية إجراء ذلك، راجع إنشاء أول Azure Functions في حاويات.
- النشر إلى Azure Container Apps. لمعرفة كيفية إجراء ذلك، راجع إنشاء أول Azure Functions في حاويات على Azure Container Apps.
- النشر إلى Azure Arc (معاينة). لمعرفة كيفية إجراء ذلك، راجع العمل مع الحاويات وAzure Functions.
- النشر إلى مجموعة Kubernetes. يمكنك النشر إلى نظام مجموعة باستخدام Azure Functions Core Tools. استخدم الأمر
func kubernetes deploy
.
متى تستخدمه: استخدم خيار حاوية Docker عندما تحتاج إلى مزيد من التحكم في بيئة Linux حيث يتم تشغيل تطبيق الوظائف ومكان استضافة الحاوية. تتوفر آلية النشر هذه فقط للوظائف التي تعمل على Linux.
حيث يتم تخزين محتوى التطبيق: يتم تخزين محتوى التطبيق في سجل الحاوية المحدد كجزء من الصورة.
التحكم في المصدر
يمكنك تمكين التكامل المستمر بين تطبيق الوظائف ومستودع التعليمات البرمجية المصدر. مع تمكين التحكم بالمصادر، يؤدي تحديث التعليمات البرمجية في مستودع المصدر المتصل إلى نشر أحدث تعليمة برمجية من المستودع. لمزيد من المعلومات، راجع النشر المستمر ل Azure Functions.
كيفية استخدامه: أسهل طريقة لإعداد النشر من التحكم بالمصادر هي من مركز النشر في منطقة الوظائف في المدخل. للحصول على مزيدٍ من المعلومات، راجع التوزيع المستمر في Azure Functions.
متى يتم استخدامه: استخدام عنصر التحكم في المصادر هو أفضل ممارسة للفرق التي تتعاون في تطبيقات الوظائف الخاصة بها. عنصر التحكم في المصادر هو خيار توزيع مناسب يتيح مسارات توزيع أكثر تعقيدًا. عادة ما يتم تمكين التحكم بالمصادر في فتحة التقسيم المرحلي، والتي يمكن تبديلها إلى الإنتاج بعد التحقق من صحة التحديثات من المستودع. لمزيد من المعلومات، راجع فتحات توزيع Azure Functions.
حيث يتم تخزين محتوى التطبيق: يوجد محتوى التطبيق في نظام التحكم بالمصادر، ولكن يتم تخزين محتوى تطبيق تم نسخه محليا وبنائه منه على نظام ملفات التطبيق، والذي قد يتم دعمه بواسطة Azure Files من حساب التخزين المحدد عند إنشاء تطبيق الوظائف.
Git محلي
يمكنك استخدام Git محلي لدفع التعليمات البرمجية من الجهاز المحلي إلى Azure Functions باستخدام Git.
كيفية استخدامه: اتبع الإرشادات في توزيع Git المحلي إلى Azure App Service.
متى تستخدمه: لتقليل فرصة حدوث أخطاء، يجب تجنب استخدام أساليب التوزيع التي تتطلب خطوة إضافية لمزامنة المشغلات يدويا. استخدم نشر zip عندما يكون ذلك ممكنا.
حيث يتم تخزين محتوى التطبيق: يتم تخزين محتوى التطبيق على نظام الملفات، والذي قد يتم دعمه بواسطة Azure Files من حساب التخزين المحدد عند إنشاء تطبيق الوظائف.
FTP/S
يمكنك استخدام FTP/S لنقل الملفات مباشرة إلى Azure Functions، على الرغم من أن أسلوب النشر هذا غير مستحسن. عندما لا تخطط لاستخدام FTP، يجب تعطيله. إذا اخترت استخدام بروتوكول نقل الملفات، فيجب عليك فرض بروتوكولات نقل الملفات. لمعرفة كيفية القيام به في مدخل Microsoft Azure، راجع فرض FTPS.
كيفية استخدامه: اتبع الإرشادات الموجودة في إعدادات نشر FTPS للحصول على عنوان URL وبيانات الاعتماد التي يمكنك استخدامها للتوزيع إلى تطبيق الوظائف باستخدام FTPS.
متى تستخدمه: لتقليل فرصة حدوث أخطاء، يجب تجنب استخدام أساليب التوزيع التي تتطلب خطوة إضافية لمزامنة المشغلات يدويا. استخدم نشر zip عندما يكون ذلك ممكنا.
حيث يتم تخزين محتوى التطبيق: يتم تخزين محتوى التطبيق على نظام الملفات، والذي قد يتم دعمه بواسطة Azure Files من حساب التخزين المحدد عند إنشاء تطبيق الوظائف.
تحرير المدخل
في المحرر المستند إلى المدخل، يمكنك تحرير الملفات الموجودة في تطبيق الوظائف مباشرةً (يتم توزيعها بشكل أساسي في كل مرة تحفظ فيها التغييرات).
كيفية استخدامه: لكي تتمكن من تحرير وظائفك في مدخل Microsoft Azure، يجب أن تكون قد أنشأت وظائفك في المدخل. للحفاظ على مصدر واحد للحقيقة، باستخدام أي أسلوب توزيع آخر يجعل الوظيفة للقراءة فقط ويمنع استمرار تحرير المدخل. للعودة إلى الحالة التي يمكنك فيها تحرير ملفاتك في مدخل Microsoft Azure، يمكنك إعادة تشغيل وضع التحرير يدويا وإزالة
Read/Write
أي إعدادات تطبيق متعلقة بالنشر (مثلWEBSITE_RUN_FROM_PACKAGE
).
متى يتم استخدامه: المدخل هو وسيلة جيدة للبدء مع Azure Functions. بسبب قيود التطوير في مدخل Microsoft Azure، يجب عليك استخدام إحدى أدوات العميل التالية أكثر تقدما من أعمال التطوير:
حيث يتم تخزين محتوى التطبيق: يتم تخزين محتوى التطبيق على نظام الملفات، والذي قد يتم دعمه بواسطة Azure Files من حساب التخزين المحدد عند إنشاء تطبيق الوظائف.
سلوكيات التوزيع
عند توزيع التحديثات إلى التعليمة البرمجية لتطبيق الوظائف، يتم إنهاء الوظائف المنفذة حاليًا. بعد اكتمال التوزيع، يتم تحميل التعليمة البرمجية الجديدة لبدء معالجة الطلبات. راجع تحسين أداء وموثوقية Azure Functions لمعرفة كيفية كتابة وظائف عديمة الحالة والدفاعية.
إذا كنت بحاجة إلى مزيد من التحكم في هذا الانتقال، ينبغي استخدام فتحات التوزيع.
الفتحات الخاصة بالنشر
عند توزيع تطبيق الوظائف على Azure، يمكنك التوزيع إلى فتحة توزيع منفصلة بدلاً من التوزيع مباشرةً في التشغيل. التوزيع إلى فتحة توزيع ثم التبديل إلى الإنتاج بعد التحقق هو الطريقة الموصى بها لتكوين النشر المستمر.
تعتمد الطريقة التي تنشر بها على فتحة على أداة التوزيع المحددة التي تستخدمها. على سبيل المثال، عند استخدام Azure Functions Core Tools، يمكنك تضمين--slot
الخيار للإشارة إلى اسم فتحة معينة للأمر func azure functionapp publish
.
للحصول على مزيدٍ من المعلومات حول فتحات التوزيع، راجع وثائق فتحات توزيع Azure Functions للحصول على التفاصيل.
الخطوات التالية
اقرأ هذه المقالات لمعرفة المزيد حول توزيع تطبيق الوظائف: