Kesederhanaan Cloud Functions memungkinkan Anda mengembangkan kode dengan cepat dan menjalankannya di lingkungan tanpa server. Pada skala sedang, biaya menjalankan fungsi rendah, dan mengoptimalkan kode Anda mungkin bukan prioritas utama. Namun, saat penyebaran Anda meningkat, mengoptimalkan kode Anda menjadi semakin penting.
Dokumen ini menjelaskan cara mengoptimalkan jaringan untuk fungsi Anda. Beberapa manfaat optimalisasi jaringan adalah sebagai berikut:
- Kurangi waktu CPU yang dihabiskan dalam membuat koneksi baru di setiap panggilan fungsi.
- Mengurangi kemungkinan kehabisan koneksi atau kuota DNS.
Mempertahankan Koneksi yang Persistent
Bagian ini memberikan contoh bagaimana mempertahankan koneksi persisten dalam suatu fungsi. Kegagalan untuk melakukannya dapat mengakibatkan kuota koneksi cepat habis.
Skenario berikut dicakup dalam bagian ini:
- HTTP/S
- API Google
Permintaan HTTP/S
Cuplikan kode yang dioptimalkan di bawah ini menunjukkan cara mempertahankan koneksi tetap alih-alih membuat koneksi baru pada setiap pemanggilan fungsi:
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(); });
Mengakses Google API
Contoh di bawah menggunakan Cloud Pub/Sub , tetapi pendekatan ini juga berfungsi untuk pustaka klien lain—misalnya, Cloud Natural Language atau Cloud Spanner . Perhatikan bahwa peningkatan kinerja mungkin bergantung pada implementasi pustaka klien tertentu saat ini.
Membuat objek klien PubSub
menghasilkan satu koneksi dan dua kueri DNS per pemanggilan. Untuk menghindari koneksi yang tidak perlu dan kueri DNS, buat objek klien PubSub
dalam lingkup global seperti yang ditunjukkan pada contoh di bawah ini:
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'); } }); });
Uji Beban Fungsi Anda
Untuk mengukur berapa banyak koneksi rata-rata yang dilakukan fungsi Anda, cukup terapkan sebagai fungsi HTTP dan gunakan kerangka kerja pengujian kinerja untuk menjalankannya di QPS tertentu. Salah satu pilihan yang memungkinkan adalah Artileri , yang dapat Anda aktifkan dengan satu baris:
$ artillery quick -d 300 -r 30 URL
Perintah ini mengambil URL yang diberikan pada 30 QPS selama 300 detik.
Setelah melakukan pengujian, periksa penggunaan kuota koneksi Anda di halaman kuota Cloud Functions API di Cloud Console. Jika penggunaannya secara konsisten sekitar 30 (atau kelipatannya), Anda membuat satu (atau beberapa) koneksi di setiap pemanggilan. Setelah mengoptimalkan kode, Anda akan melihat beberapa (10-30) koneksi hanya terjadi di awal pengujian.
Anda juga dapat membandingkan biaya CPU sebelum dan sesudah pengoptimalan plot kuota CPU di halaman yang sama.