تتيح لك بساطة Cloud Functions تطوير الرموز البرمجية وتشغيلها بسرعة في بيئة بدون خادم. وعندما يكون عدد مرات التشغيل معتدلاً، تكون تكلفة تشغيل الدوال منخفضة، وقد لا يبدو تحسين الرمز البرمجي أولوية قصوى. ومع ذلك، كلما زاد حجم عملية النشر، أصبحت عملية تحسين الرمز البرمجي أكثر أهمية.
يوضّح هذا المستند كيفية تحسين الشبكات لوظائفك. في ما يلي بعض مزايا تحسين الشبكات:
- تقليل وقت وحدة المعالجة المركزية (CPU) المستغرَق في إنشاء اتصالات صادرة جديدة عند كل استدعاء دالة
- الحدّ من احتمالية استنفاد الحصص المخصّصة للاتصال أو نظام أسماء النطاقات
الحفاظ على الاتصالات المستمرة
يعرض هذا القسم أمثلة على كيفية الحفاظ على اتصالات مستمرة في دالة. وقد يؤدي عدم إجراء ذلك إلى استنفاد حصص الاتصال بسرعة.
يتناول هذا القسم السيناريوهات التالية:
- HTTP/S
- Google APIs
طلبات HTTP/S
يوضّح مقتطف الرمز المحسّن أدناه كيفية الحفاظ على الاتصالات المستمرة بدلاً من إنشاء اتصال جديد عند كل استدعاء دالة:
Node.js
const http = require('http'); const functions = require('firebase-functions'); // Setting the `keepAlive` option to `true` keeps // connections open between function invocations const agent = new http.Agent({keepAlive: true}); exports.function = functions.https.onRequest((request, response) => { req = http.request({ host: '' , port: 80, path: '' , method: 'GET', agent: agent, // Holds the connection open after the first invocation }, res => { let rawData = ''; res.setEncoding('utf8'); res.on('data', chunk => { rawData += chunk; }); res.on('end', () => { response.status(200).send(`Data: ${rawData}`); }); }); req.on('error', e => { response.status(500).send(`Error: ${e.message}`); }); req.end(); });
Python
from firebase_functions import https_fn import requests # Create a global HTTP session (which provides connection pooling) session = requests.Session() @https_fn.on_request() def connection_pooling(request): # The URL to send the request to url = "http://example.com" # Process the request response = session.get(url) response.raise_for_status() return https_fn.Response("Success!")
تستخدم دالة HTTP هذه مجموعة اتصالات لتقديم طلبات HTTP. تأخذ هذه الدالة كائن طلب (flask.Request
) وتعرض نص الاستجابة أو أي مجموعة من القيم التي يمكن تحويلها إلى كائن Response
باستخدام make_response
.
الوصول إلى Google APIs
يستخدم المثال أدناه Cloud Pub/Sub، ولكن يمكن استخدام هذا الأسلوب أيضًا مع مكتبات برامج أخرى، مثل Cloud Natural Language أو Cloud Spanner. يُرجى العِلم أنّ التحسينات في الأداء قد تعتمد على التنفيذ الحالي لمكتبات عملاء معيّنة.
يؤدي إنشاء عنصر عميل Pub/Sub إلى إنشاء اتصال واحد وطلبَي بحث في نظام أسماء النطاقات لكل عملية استدعاء. لتجنُّب عمليات الربط وطلبات نظام أسماء النطاقات غير الضرورية، أنشِئ عنصر عميل Pub/Sub في النطاق العام كما هو موضّح في المثال أدناه:
node.js
const PubSub = require('@google-cloud/pubsub'); const functions = require('firebase-functions'); const pubsub = PubSub(); exports.function = functions.https.onRequest((req, res) => { const topic = pubsub.topic('' ); topic.publish('Test message', err => { if (err) { res.status(500).send(`Error publishing the message: ${err}`); } else { res.status(200).send('1 message published'); } }); });
Python
import os from firebase_functions import https_fn from google.cloud import pubsub_v1 # from firebase_functions import https_fn # Create a global Pub/Sub client to avoid unneeded network activity pubsub = pubsub_v1.PublisherClient() @https_fn.on_request() def gcp_api_call(request): project = os.getenv("GCP_PROJECT") request_json = request.get_json() topic_name = request_json["topic"] topic_path = pubsub.topic_path(project, topic_name) # Process the request data = b"Test message" pubsub.publish(topic_path, data=data) return https_fn.Response("1 message published")
تستخدم دالة HTTP هذه نسخة مخزّنة مؤقتًا من مكتبة العميل لتقليل عدد الاتصالات المطلوبة لكل استدعاء دالة. تتلقّى هذه الدالة كائن طلب (flask.Request
) وتعرض نص الاستجابة أو أي مجموعة من القيم التي يمكن تحويلها إلى كائن Response
باستخدام make_response
.
يتم ضبط متغير البيئة GCP_PROJECT
تلقائيًا في وقت تشغيل Python 3.7. في أوقات التشغيل اللاحقة، احرص على تحديدها عند نشر الدالة. اطّلِع على ضبط متغيرات البيئة.
الاتصالات الصادرة
انتهاء مهلة الطلبات الصادرة
يتم تحديد مهلة بعد 10 دقائق من وقت الخمول للطلبات الواردة من وظيفتك إلى شبكة VPC. بالنسبة إلى الطلبات التي ترسلها الدالة إلى الإنترنت، يتم تحديد مهلة بعد 20 دقيقة من وقت عدم النشاط.
إعادة ضبط الاتصال الصادر
قد يتم إنهاء عمليات بث الاتصال من وظيفتك إلى كل من شبكة VPC والإنترنت واستبدالها بشكل متقطع عند إعادة تشغيل البنية الأساسية أو تحديثها. إذا كان تطبيقك يعيد استخدام الاتصالات التي تدوم طويلاً، ننصحك بضبط تطبيقك على إعادة إنشاء الاتصالات لتجنُّب إعادة استخدام اتصال غير نشط.
اختبار التحميل على الدالة
لقياس عدد الاتصالات التي تنفّذها الدالة في المتوسط، يمكنك نشرها كدالة HTTP واستخدام إطار عمل لاختبار الأداء لاستدعائها بمعدّل طلبات في الثانية معيّن. أحد الخيارات المتاحة هو Artillery، ويمكنك استخدامه من خلال سطر واحد:
$ artillery quick -d 300 -r 30 URL
يجلب هذا الأمر عنوان URL المحدّد بمعدّل 30 طلب بحث في الثانية لمدة 300 ثانية.
بعد إجراء الاختبار، تحقَّق من استخدام حصة الاتصال في صفحة حصة واجهة برمجة التطبيقات Cloud Functions في Cloud Console. إذا كان الاستخدام يبلغ حوالي 30 (أو مضاعفاته) بشكل منتظم، يعني ذلك أنّك تنشئ اتصالاً واحدًا (أو عدة اتصالات) في كل عملية استدعاء. بعد تحسين الرمز، من المفترض أن تلاحظ حدوث بضعة اتصالات (من 10 إلى 30) في بداية الاختبار فقط.
يمكنك أيضًا مقارنة تكلفة وحدة المعالجة المركزية قبل التحسين وبعده على الرسم البياني لحصة وحدة المعالجة المركزية في الصفحة نفسها.