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

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

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

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

الحفاظ على التوصيلات المستمرة

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

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

  • HTTP / S.
  • جوجل APIs

طلبات HTTP / S

يوضح مقتطف الشفرة المحسّن أدناه كيفية الحفاظ على الاتصالات المستمرة بدلاً من إنشاء اتصال جديد عند استدعاء كل وظيفة:

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();
});

الوصول إلى Google APIs

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

ينتج عن إنشاء كائن عميل PubSub اتصال واحد واستعلامان DNS لكل طلب. لتجنب الاتصالات غير الضرورية واستعلامات DNS ، قم بإنشاء كائن عميل PubSub في النطاق العام كما هو موضح في النموذج أدناه:

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');
        }
    });
});

اختبار الحمل لوظيفتك

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

$ artillery quick -d 300 -r 30 URL

يقوم هذا الأمر بجلب عنوان URL المحدد بمعدل 30 QPS لمدة 300 ثانية.

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

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