1. nesil Node.js işlevlerini 2. nesile yükseltin

Şu anda 1. nesil işlevleri kullanan uygulamalar, bu kılavuzdaki talimatları kullanarak 2. nesle geçmeyi düşünmelidir. 2. nesil işlevler, daha iyi performans, daha iyi yapılandırma, daha iyi izleme ve daha fazlasını sağlamak için Cloud Run'ı kullanır.

Bu sayfadaki örnekler, JavaScript'i CommonJS modülleriyle kullandığınızı varsayar (stil içe aktarma require ), ancak aynı ilkeler ESM'li JavaScript ( import … from style imports) ve TypeScript için geçerlidir.

geçiş süreci

1. nesil ve 2. nesil işlevler aynı dosyada yan yana bulunabilir. Bu, hazır olduğunuzda parça parça kolay geçiş sağlar. Her seferinde bir işlevi geçirmenizi, devam etmeden önce test ve doğrulama yapmanızı öneririz.

Firebase CLI ve firebase-function sürümlerini doğrulayın

En azından Firebase CLI sürüm 12.00 ve firebase-functions sürüm 4.3.0 kullandığınızdan emin olun. Daha yeni herhangi bir sürüm, 2. neslin yanı sıra 1. nesli de destekleyecektir.

İçe aktarmaları güncelle

2. nesil işlevler firebase-functions SDK'daki v2 alt paketinden içe aktarılır. Bu farklı içe aktarma yolu, Firebase CLI'nin işlev kodunuzu 1. veya 2. nesil işlev olarak konuşlandırıp dağıtmayacağını belirlemek için ihtiyaç duyduğu tek şeydir.

v2 alt paketi modülerdir ve yalnızca ihtiyacınız olan belirli modülü içe aktarmanızı öneririz.

Önce: 1. nesil

const functions = require("firebase-functions");

Sonra: 2. nesil

// explicitly import each trigger
const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");

Tetikleyici tanımlarını güncelleyin

2. nesil SDK modüler içeri aktarmayı tercih ettiğinden, tetikleyici tanımlarını önceki adımdan değişen içe aktarmaları yansıtacak şekilde güncelleyin.

Bazı tetikleyiciler için geri aramalara iletilen bağımsız değişkenler değişti. Bu örnekte, onDocumentCreated geri çağırma argümanlarının tek bir event nesnesinde birleştirildiğini unutmayın. Ek olarak, bazı tetikleyiciler, onRequest tetikleyicinin cors seçeneği gibi kullanışlı yeni yapılandırma özelliklerine sahiptir.

Önce: 1. nesil

const functions = require("firebase-functions");

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

exports.uppercase = functions.firestore
  .document("my-collection/{docId}")
  .onCreate((change, context) => {
    // ...
  });

Sonra: 2. nesil

const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");

exports.date = onRequest({cors: true}, (req, res) => {
  // ...
});

exports.uppercase = onDocumentCreated("my-collection/{docId}", (event) => {
  /* ... */
});

Parametreli konfigürasyon kullan

2. nesil işlevler, kod tabanınızın içinde bildirimsel olarak yapılandırma parametrelerini tanımlamak için daha güvenli bir arabirim lehine functions.config desteğini bırakır. Yeni params modülüyle CLI, tüm parametrelerin geçerli bir değeri olmadıkça dağıtımı engelleyerek bir işlevin eksik konfigürasyonla dağıtılmamasını sağlar.

params alt paketine geçiş

functions.config ile ortam yapılandırmasını kullanıyorsanız, mevcut yapılandırmanızı parametreli yapılandırmaya geçirebilirsiniz.

Önce: 1. nesil

const functions = require("firebase-functions");

exports.date = functions.https.onRequest((req, res) => {
  const date = new Date();
  const formattedDate =
date.toLocaleDateString(functions.config().dateformat);

  // ...
});

Sonra: 2. nesil

const {onRequest} = require("firebase-functions/v2/https");
const {defineString} = require("firebase-functions/params");

const dateFormat = defineString("DATE_FORMAT");

exports.date = onRequest((req, res) => {
  const date = new Date();
  const formattedDate = date.toLocaleDateString(dateFormat.value());

  // ...
});

Parametre değerlerini ayarla

İlk dağıttığınızda, Firebase CLI tüm parametre değerlerini sorar ve değerleri bir dotenv dosyasına kaydeder. functions.config değerlerinizi dışa aktarmak için firebase functions:config:export çalıştırın.

Ek güvenlik için parametre türleri ve doğrulama kuralları da belirtebilirsiniz.

Özel durum: API Anahtarları

params modülü, API anahtarları gibi hassas değerlere ayrıntılı erişim kontrolü sağlayan Cloud Secret Manager ile entegre olur. Daha fazla bilgi için gizli parametrelere bakın.

Önce: 1. nesil

const functions = require("firebase-functions");

exports.getQuote = functions.https.onRequest(async (req, res) => {
  const quote = await fetchMotivationalQuote(functions.config().apiKey);
  // ...
});

Sonra: 2. nesil

const {onRequest} = require("firebase-functions/v2/https");
const {defineSecret} = require("firebase-functions/params");

// Define the secret parameter
const apiKey = defineSecret("API_KEY");

exports.getQuote = onRequest(
  // make the secret available to this function
  { secrets: [apiKey] },
  async (req, res) => {
    // retrieve the value of the secret
    const quote = await fetchMotivationalQuote(apiKey.value());
    // ...
  }
);

Çalışma zamanı seçeneklerini ayarla

Çalışma zamanı seçeneklerinin yapılandırması 1. ve 2. nesil arasında değişti. 2. nesil ayrıca tüm işlevler için seçenekleri ayarlamak üzere yeni bir yetenek ekler.

Önce: 1. nesil

const functions = require("firebase-functions");

exports.date = functions
  .runWith({
    // Keep 5 instances warm for this latency-critical function
    minInstances: 5,
  })
  // locate function closest to users
  .region("asia-northeast1")
  .https.onRequest((req, res) => {
    // ...
  });

exports.uppercase = functions
  // locate function closest to users and database
  .region("asia-northeast1")
  .firestore.document("my-collection/{docId}")
  .onCreate((change, context) => {
    // ...
  });

Sonra: 2. nesil

const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");
const {setGlobalOptions} = require("firebase-functions/v2");

// locate all functions closest to users
setGlobalOptions({ region: "asia-northeast1" });

exports.date = onRequest({
    // Keep 5 instances warm for this latency-critical function
    minInstances: 5,
  }, (req, res) => {
  // ...
});

exports.uppercase = onDocumentCreated("my-collection/{docId}", (event) => {
  /* ... */
});

Eşzamanlılık kullan

2. nesil işlevlerin önemli bir avantajı, tek bir işlev örneğinin aynı anda birden fazla isteğe hizmet verebilmesidir. Bu, son kullanıcıların yaşadığı soğuk çalıştırma sayısını önemli ölçüde azaltabilir. Eşzamanlılık varsayılan olarak 80 olarak ayarlanmıştır, ancak bunu 1 ile 1000 arasında herhangi bir değere ayarlayabilirsiniz:

const {onRequest} = require("firebase-functions/v2/https");

exports.date = onRequest({
    // set concurrency value
    concurrency: 500
  },
  (req, res) => {
    // ...
});

Eşzamanlılığı ayarlamak, performansı artırabilir ve işlevlerin maliyetini azaltabilir. Eşzamanlı isteklere izin ver bölümünde eşzamanlılık hakkında daha fazla bilgi edinin.

Genel değişken kullanımını denetle

Eşzamanlılık düşünülmeden yazılan 1. nesil işlevler, her istekte ayarlanan ve okunan genel değişkenleri kullanabilir. Eşzamanlılık etkinleştirildiğinde ve tek bir örnek aynı anda birden çok isteği işlemeye başladığında, eşzamanlı istekler aynı anda global değişkenleri ayarlamaya ve okumaya başladığından bu, işlevinizde hatalara neden olabilir.

Yükseltme sırasında, 1. nesil davranışı geri yüklemek için işlevinizin CPU'sunu gcf_gen1 olarak ayarlayabilir ve concurrency 1 olarak ayarlayabilirsiniz:

const {onRequest} = require("firebase-functions/v2/https");

exports.date = onRequest({
    // TEMPORARY FIX: remove concurrency
    cpu: "gcf_gen1",
    concurrency: 1
  },
  (req, res) => {
    // ...
});

Ancak bu, 2. nesil işlevlerin performans avantajlarını kaybettiği için uzun vadeli bir düzeltme olarak önerilmez. Bunun yerine, işlevlerinizde genel değişkenlerin kullanımını denetleyin ve hazır olduğunuzda bu geçici ayarları kaldırın.

Trafiği yeni 2. nesil işlevlere taşıyın

Bir işlevin bölgesini veya tetikleme türünü değiştirirken olduğu gibi, 2. nesil işleve yeni bir ad vermeniz ve trafiği yavaşça ona taşımanız gerekir.

Aynı ada sahip bir işlevi 1. nesilden 2. nesile yükseltmek ve firebase deploy çalıştırmak mümkün değildir. Bunu yapmak hataya neden olur:

Upgrading from GCFv1 to GCFv2 is not yet supported. Please delete your old function or wait for this feature to be ready.

Bu adımları uygulamadan önce, fonksiyonunuzun idempotent olduğundan emin olun, çünkü değişiklik sırasında fonksiyonunuzun hem yeni versiyonu hem de eski versiyonu aynı anda çalışacak. Örneğin, Firestore'da yazma olaylarına yanıt veren bir 1. nesil işleviniz varsa, bu olaylara yanıt olarak bir yazmaya iki kez, bir kez 1. nesil işlev tarafından ve bir kez de 2. nesil işlev tarafından yanıt verildiğinden emin olun. tutarlı durum

  1. İşlev kodunuzda işlevi yeniden adlandırın. Örneğin, resizeImage resizeImageSecondGen olarak yeniden adlandırın.
  2. İşlevi, hem orijinal 1. nesil işlevi hem de 2. nesil işlevi çalışacak şekilde dağıtın.
    1. Çağrılabilir, Görev Kuyruğu ve HTTP tetikleyicileri söz konusu olduğunda, istemci kodunu 2. nesil işlevin adı veya URL'si ile güncelleyerek tüm istemcileri 2. nesil işleve yönlendirmeye başlayın.
    2. Arka plan tetikleyicileriyle, hem 1. nesil hem de 2. nesil işlevler, konuşlandırmanın hemen ardından her olaya yanıt verecektir.
  3. Tüm trafik taşındığında, firebase CLI'nin firebase functions:delete komutunu kullanarak 1. gen işlevini silin.
    1. İsteğe bağlı olarak, 2. nesil işlevi, 1. nesil işlevin adıyla eşleşecek şekilde yeniden adlandırın.