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

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

Bu sayfadaki örneklerde, CommonJS modülleriyle (require stili içe aktarma) birlikte JavaScript kullandığınız varsayılmaktadır, ancak ESM (import … from stili içe aktarma) ve TypeScript içeren JavaScript için de aynı ilkeler geçerlidir.

Taşıma süreci

1. nesil ve 2. nesil işlevler, aynı dosyada yan yana bir arada bulunabilir. Bu sayede hazır olduğunuz anda taşıma işlemini parça parça kolayca yapabilirsiniz. Her defasında bir işlevi taşımanızı, devam etmeden önce test ve doğrulama gerçekleştirmenizi öneririz.

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

En az Firebase CLI sürümü 12.00 ve firebase-functions 4.3.0 sürümlerini kullandığınızdan emin olun. Yeni sürümler hem 2. nesil hem de 1. nesilleri destekler.

İçe aktarmaları güncelle

2. nesil işlevler, firebase-functions SDK'sındaki v2 alt paketinden içe aktarılır. Firebase CLI'ın, işlev kodunuzun 1. nesil mi yoksa 2. nesil işlev olarak mı dağıtılacağını belirlemek için ihtiyaç duyduğu tek şey bu farklı içe aktarma yöntemidir.

v2 alt paketi modülerdir. Ayrıca, 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çe aktarmaları desteklediğinden tetikleyici tanımlarını önceki adımda değiştirilen içe aktarmaları yansıtacak şekilde güncelleyin.

Bazı tetikleyiciler için geri çağırmalara iletilen bağımsız değişkenler değişti. Bu örnekte, onDocumentCreated geri çağırma işlevinin bağımsız değişkenlerinin tek bir event nesnesinde birleştirildiğine dikkat edin. Ayrıca bazı tetikleyiciler, onRequest tetikleyicisinin 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) => {
  /* ... */
});

Parametre haline getirilmiş yapılandırma kullan

2. nesil işlevler functions.config desteğini sonlandırıp bunun yerine kod tabanınızda yapılandırma parametrelerini bildirimli olarak tanımlama için daha güvenli bir arayüz kullanıma sunuldu. Yeni params modülüyle birlikte KSA, tüm parametreler geçerli bir değere sahip olmadığı sürece dağıtımı engeller. Böylece, bir işlevin eksik yapılandırma ile dağıtılmaması sağlanır.

params alt paketine taşı

functions.config ile ortam yapılandırmasını kullanıyorsanız mevcut yapılandırmanızı parametreleştirilmiş yapılandırmaya taşıyabilirsiniz.

Ö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 ayarlama

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

Daha fazla güvenlik için parametre türlerini ve doğrulama kurallarını 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 edilebilir. Daha fazla bilgi için gizli parametreler bölümüne 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 ayarlama

Çalışma zamanı seçeneklerinin yapılandırması, 1. ve 2. nesil arasında değişti. 2. nesil, tüm işlevler için seçenekleri belirlemenizi sağlayan yeni bir özellik de eklendi.

Ö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ığı kullanma

2. nesil işlevlerin önemli bir avantajı, tek bir işlev örneğinin aynı anda birden fazla istek sunabilmesidir. Bu, son kullanıcıların yaşadığı baştan başlatma sayısını önemli ölçüde azaltabilir. Varsayılan olarak eşzamanlılık 80 değerine ayarlanır ancak 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ılık hakkında daha fazla bilgiyi Eşzamanlı isteklere izin verme bölümünde bulabilirsiniz.

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

Eşzamanlılık dikkate alınmadan 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 fazla isteği işlemeye başladığında eşzamanlı istekler aynı anda genel değişkenleri ayarlamaya ve okumaya başladığından işlevinizde hatalar oluşabilir.

Yükseltme sırasında 1. nesil davranışı geri yüklemek için işlevinizin CPU'sunu gcf_gen1, concurrency değerini ise 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 çözüm olarak önerilmez. Bunun yerine, işlevlerinizdeki 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 tetikleyici türünü değiştirirken olduğu gibi 2. nesil işleve yeni bir ad vermeniz ve trafiği bu işleve yavaş yavaş taşımanız gerekir.

Aynı ada sahip bir işlevi 1. nesilden 2. nesile yükseltip firebase deploy çalıştırmak mümkün değildir. Bu, 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 işlevinizin eşdeğerli olduğundan emin olun. Çünkü işlevinizin hem yeni hem de eski sürümü değişiklik sırasında aynı anda çalışır. Örneğin, Firestore'da yazma etkinliklerine yanıt veren 1. nesil bir işleviniz varsa bir yazma işlemine bir kez 1. nesil işlevi ve bir kez de 2. nesil işlev tarafından olmak üzere iki kez yanıt verdiğinizden ve bu etkinliklere yanıt olarak uygulamanızın tutarlı bir durumda kaldığından emin olun.

  1. İşlevler kodunuzdaki işlevi yeniden adlandırın. Örneğin, resizeImage adını resizeImageSecondGen olarak değiştirin.
  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 Sırası ve HTTP tetikleyicileri söz konusu olduğunda istemci kodunu 2. nesil işlevin adı veya URL'siyle güncelleyerek tüm istemcileri 2. nesil işleve yönlendirmeye başlayın.
    2. Arka plan tetikleyicileri sayesinde hem 1. nesil hem de 2. nesil işlevleri, dağıtımdan sonra her etkinliğe anında yanıt verir.
  3. Tüm trafik taşındıktan sonra, firebase CLI'nın firebase functions:delete komutunu kullanarak 1. nesil işlevini silin.
    1. Dilerseniz 2. nesil işlevini, 1. nesil işlevinin adıyla eşleşecek şekilde yeniden adlandırabilirsiniz.