تحسين الشبكات

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

يصف هذا المستند كيفية تحسين الشبكات للوظائف. بعض فيما يلي مزايا تحسين الشبكات:

  • تقليل الوقت المستغرَق في إنشاء اتصالات صادرة جديدة في كل وحدة معالجة مركزية الدالة.
  • تقليل احتمالية نفاد الاتصال أو نظام أسماء النطاقات حصص.

الحفاظ على علاقات دائمة

يقدم هذا القسم أمثلة حول كيفية الحفاظ على الاتصالات المستمرة في الأخرى. قد يؤدي عدم إجراء ذلك إلى استنفاد حصص الاتصال بسرعة.

يتم تناول السيناريوهات التالية في هذا القسم:

  • 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

الوصول إلى واجهات برمجة التطبيقات (API) من Google

يستخدم المثال أدناه خدمة Cloud Pub/Sub، ولكن يصلح هذا الأسلوب أيضًا لمكتبات العميل الأخرى - على سبيل المثال، Cloud Natural Language أو Cloud Spanner يُرجى العِلم أنّ الأداء قد تعتمد التحسينات على التنفيذ الحالي لبرنامج معيّن المكتبات.

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

عقدة.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 تلقائيًا في بايثون بيئة التشغيل 3.7 في بيئات التشغيل اللاحقة، احرص على تحديده على نشر الوظائف. عرض ضبط متغيّرات البيئة

اختبار التحميل للدالة

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

$ artillery quick -d 300 -r 30 URL

يجلب هذا الأمر عنوان URL المحدَّد بسرعة 30 لقطة في الثانية لمدة 300 ثانية.

بعد إجراء الاختبار، تحقق من استخدام حصة الاتصال على صفحة حصة واجهة برمجة التطبيقات في Cloud Functions في Cloud Console. فإذا كان الاستخدام ثابتًا حول 30 (أو أكثر)، في كل استدعاء (أو أكثر). بعد تحسين التعليمة البرمجية، فمن المفترض أن تلاحظ حدوث عدد قليل من الاتصالات (10-30) في بداية الاختبار فقط.

يمكنك أيضًا مقارنة تكلفة وحدة المعالجة المركزية (CPU) قبل التحسين وبعده على وحدة المعالجة المركزية (CPU) مخطط الحصة على نفس الصفحة.