سادگی توابع Cloud به شما امکان می دهد به سرعت کد را توسعه دهید و آن را در یک محیط بدون سرور اجرا کنید. در مقیاس متوسط، هزینه اجرای توابع کم است و بهینه سازی کد شما ممکن است اولویت بالایی به نظر نرسد. با این حال، همانطور که استقرار شما افزایش می یابد، بهینه سازی کد شما اهمیت فزاینده ای پیدا می کند.
این سند نحوه بهینه سازی شبکه را برای عملکردهای خود شرح می دهد. برخی از مزایای بهینه سازی شبکه به شرح زیر است:
- زمان صرف شده برای برقراری اتصالات جدید در هر فراخوانی عملکرد CPU را کاهش دهید.
- احتمال تمام شدن اتصال یا سهمیه DNS را کاهش دهید.
حفظ اتصالات پایدار
در این بخش مثال هایی از نحوه حفظ اتصالات پایدار در یک تابع ارائه می شود. عدم انجام این کار می تواند منجر به فرسودگی سریع سهمیه های اتصال شود.
سناریوهای زیر در این بخش پوشش داده شده است:
- HTTP/S
- API های گوگل
درخواست های 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(); });
دسترسی به API های گوگل
مثال زیر از 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) فقط در ابتدای آزمایش رخ می دهد.
همچنین می توانید هزینه CPU را قبل و بعد از بهینه سازی در نمودار سهمیه CPU در همان صفحه مقایسه کنید.