إدارة الاتصالات في دالات Azure

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

ملاحظة

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

حد الاتصال

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

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

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

العملاء الثابتون

لتجنب عقد اتصالات أكثر من الضروري، أعد استخدام مثيلات العميل بدلاً من إنشاء مثيلات جديدة مع كل استدعاء للدالة. نوصي بإعادة استخدام اتصالات العميل لأي لغة قد تكتب الدالة بها. على سبيل المثال، يمكن لعملاء ‎.NET مثل HttpClient وDocumentClient وعملاء تخزين Azure إدارة الاتصالات إذا كنت تستخدم عميلاً ثابتاً واحداً.

فيما يلي بعض الإرشادات التي يجب اتباعها عند استخدام عميل خاص بالخدمة في تطبيق دالات Azure:

  • لا تقم بإنشاء عميل جديد مع كل استدعاء للدالة.
  • قم بإنشاء عميل ثابت واحد يمكن لكل استدعاء دالة استخدامه.
  • فكّر في إنشاء عميل ثابت واحد في فئة مساعد مشتركة إذا كانت دالات مختلفة تستخدم نفس الخدمة.

أمثلة على التعليمة البرمجية للعميل

يوضح هذا القسم أفضل الممارسات لإنشاء واستخدام عملاء من التعليمة البرمجية للدالة.

طلبات HTTP

فيما يلي مثال على التعليمة البرمجية لدالة C#‎ التي تنشئ مثيل HttpClient ثابتاً:

// Create a single, static HttpClient
private static HttpClient httpClient = new HttpClient();

public static async Task Run(string input)
{
    var response = await httpClient.GetAsync("https://example.com");
    // Rest of function
}

من الأسئلة المتداولة حول HttpClient في .NET "هل يجب أن أتخلص من العميل؟" بشكل عام، تتخلص من العناصر التي تنفذ IDisposable عند الانتهاء من استخدامها. ولكن لا يمكنك التخلص من عميل ثابت لأنك لم تنتهِ من استخدامه عند انتهاء الدالة. تريد أن يبقى العميل الثابت طوال مدة التطبيق الخاص بك.

عملاء قاعدة بيانات Azure Cosmos

يتصل CosmosClient بمثيل قاعدة بيانات Azure Cosmos. توصيك وثائق قاعدة بيانات Azure Cosmos باستخدام عميل قاعدة بيانات Azure Cosmos أحادية لمدة بقاء تطبيقك. يوضح المثال التالي نمطاً واحداً للقيام بذلك في دالة:

#r "Microsoft.Azure.Cosmos"
using Microsoft.Azure.Cosmos;

private static Lazy<CosmosClient> lazyClient = new Lazy<CosmosClient>(InitializeCosmosClient);
private static CosmosClient cosmosClient => lazyClient.Value;

private static CosmosClient InitializeCosmosClient()
{
    // Perform any initialization here
    var uri = "https://youraccount.documents.azure.com:443";
    var authKey = "authKey";
   
    return new CosmosClient(uri, authKey);
}

public static async Task Run(string input)
{
    Container container = cosmosClient.GetContainer("database", "collection");
    MyItem item = new MyItem{ id = "myId", partitionKey = "myPartitionKey", data = "example" };
    await container.UpsertItemAsync(document);
   
    // Rest of function
}

أنشئ أيضاً ملفاً اسمه "function.proj" للمشغل الخاص بك وأضف المحتوى أدناه:


<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Cosmos" Version="3.23.0" />
    </ItemGroup>
</Project>

اتصالات SqlClient

يمكن للتعليمات البرمجية الدالة استخدام موفر بيانات ‎.NET Framework لـ SQL Server (SqlClient) لإجراء اتصالات بقاعدة بيانات SQL ارتباطية. هذا هو أيضاً الموفر الأساسي لأطر عمل البيانات التي تعتمد على ADO.NET، مثل Entity Framework. بعكس اتصالات HttpClient وDocumentClientتنفّذ ADO.NET تجميع الاتصال بشكل افتراضي. ولكن لأنه لا يزال من الممكن نفاد الاتصالات، يجب تحسين الاتصالات بقاعدة البيانات. لمزيد من المعلومات، راجع تجميع اتصال SQL Server‏ (ADO.NET).

تلميح

تحصل بعض أطر عمل البيانات، مثل Entity Framework، عادة على سلاسل اتصال من قسم ConnectionStrings لملف التكوين. في هذه الحالة، يتعين عليك أن تضيف سلاسل اتصال قاعدة بيانات SQL بشكل صريح إلى مجموعة سلاسل الاتصال من إعدادات تطبيق الدالة وفي ملف local.settings.json في مشروعك المحلي. إذا كنت تقوم بإنشاء مثيل SqlConnection في التعليمة البرمجية للدالة لديك، يجب عليك تخزين قيمة سلسلة الاتصال في إعدادات التطبيق مع اتصالاتك الأخرى.

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

لمزيد من المعلومات حول الأسباب التي تدفعنا للتوصية بالعملاء الثابتين، راجع مضاد النمط الخاص بإنشاء المثيل غير صحيح.

لمزيد من النصائح حول أداء دالات Azure، راجع تحسين أداء وموثوقية دالات Azure.