Ağ oluşturmayı optimize etme

Cloud Functions'ın basitliği, kodu hızla geliştirmenize ve sunucusuz bir ortamda çalıştırmanıza olanak tanır. Orta ölçekte, işlevleri çalıştırmanın maliyeti düşüktür ve kodunuzu optimize etmek yüksek bir öncelik gibi görünmeyebilir. Ancak dağıtımınız büyüdükçe, kodunuzu optimize etmek giderek daha önemli hale gelir.

Bu belge, işlevleriniz için ağ oluşturmayı nasıl optimize edeceğinizi açıklar. Ağ oluşturmayı optimize etmenin faydalarından bazıları şunlardır:

  • Her işlev çağrısında yeni bağlantılar kurmak için harcanan CPU süresini azaltın.
  • Bağlantının veya DNS kotalarının tükenme olasılığını azaltın.

Kalıcı Bağlantıları Koruma

Bu bölümde, bir işlevde kalıcı bağlantıların nasıl korunacağına ilişkin örnekler verilmektedir. Bunun yapılmaması, bağlantı kotalarının hızla tükenmesine neden olabilir.

Bu bölümde aşağıdaki senaryolar ele alınmaktadır:

  • HTTP/S
  • Google API'leri

HTTP/S İstekleri

Aşağıdaki optimize edilmiş kod parçacığı, her işlev çağrısında yeni bir bağlantı oluşturmak yerine kalıcı bağlantıların nasıl korunacağını gösterir:

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 API'lerine Erişme

Aşağıdaki örnekte Cloud Pub/Sub kullanılmaktadır, ancak bu yaklaşım, Cloud Natural Language veya Cloud Spanner gibi diğer istemci kitaplıkları için de geçerlidir. Performans iyileştirmelerinin belirli istemci kitaplıklarının geçerli uygulamasına bağlı olabileceğini unutmayın.

Bir PubSub istemci nesnesi oluşturmak, çağrı başına bir bağlantı ve iki DNS sorgusu ile sonuçlanır. Gereksiz bağlantılardan ve DNS sorgularından kaçınmak için aşağıdaki örnekte gösterildiği gibi global kapsamda PubSub istemci nesnesini oluşturun:

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

İşlevinizin Yük Testi

İşlevinizin ortalama kaç bağlantı gerçekleştirdiğini ölçmek için, onu bir HTTP işlevi olarak dağıtın ve belirli QPS'de çağırmak için bir performans testi çerçevesi kullanın. Olası bir seçenek, tek bir satırla çağırabileceğiniz Artillery'dir :

$ artillery quick -d 300 -r 30 URL

Bu komut, verilen URL'yi 300 saniye boyunca 30 QPS'de getirir.

Testi gerçekleştirdikten sonra, Cloud Console'daki Cloud Functions API kota sayfasında bağlantı kotanızın kullanımını kontrol edin. Kullanım sürekli olarak 30 (veya bunun katı) civarındaysa, her çağrıda bir (veya birkaç) bağlantı kuruyorsunuz. Kodunuzu optimize ettikten sonra, yalnızca testin başında birkaç (10-30) bağlantının gerçekleştiğini görmelisiniz.

Aynı sayfada CPU kotası grafiğinde optimizasyon öncesi ve sonrası CPU maliyetini de karşılaştırabilirsiniz.