تتيح لك بساطة Cloud Functions تطوير الرموز البرمجية بسرعة وتشغيلها في بيئة بدون خادم. على نطاق متوسط، تكون تكلفة تشغيل الدوال منخفضة، وقد لا يبدو تحسين الرمز البرمجي أولوية قصوى. ومع توسيع نطاق النشر، يصبح تحسين الرمز البرمجي أكثر أهمية.
يوضّح هذا المستند كيفية تحسين الشبكات لدوالك. في ما يلي بعض مزايا تحسين الشبكات:
- تقليل وقت وحدة المعالجة المركزية المستغرَق في إنشاء اتصالات صادرة جديدة عند كل استدعاء دالة
- الحد من احتمالية نفاد الحصص المخصّصة للاتصال أو نظام أسماء النطاقات
الحفاظ على الاتصالات المستمرة
يقدّم هذا القسم أمثلة على كيفية الحفاظ على الاتصالات المستمرة في دالة. وقد يؤدي عدم إجراء ذلك إلى استنفاد حصص الاتصال بسرعة.
يتناول هذا القسم السيناريوهات التالية:
- 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 في وحدة تحكّم Google Cloud. إذا كان الاستخدام دائمًا حوالي 30 (أو مضاعفاته)، فأنت تنشئ اتصالاً واحدًا (أو عدة اتصالات) في كل استدعاء. بعد تحسين الرمز، من المفترض أن تظهر لك بعض الاتصالات (من 10 إلى 30 اتصالاً) في بداية الاختبار فقط.
يمكنك أيضًا مقارنة تكلفة وحدة المعالجة المركزية قبل التحسين وبعده في مخطّط حصة وحدة المعالجة المركزية في الصفحة نفسها.