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ı için Cloud Run'ı kullanır.

Bu sayfadaki örneklerde CommonJS modülleriyle (require stil içe aktarma işlemleri) JavaScript kullandığınız varsayılmıştır. Ancak aynı ilkeler ESM (import … from stili içe aktarma işlemleri) ve TypeScript içeren JavaScript için geçerlidir.

Taşıma süreci

1. nesil ve 2. nesil işlevler, aynı dosyada yan yana olabilir. Bu sayede hazır olduğunuzda taşıma işlemini parça parça kolayca gerçekleştirebilirsiniz. Devam etmeden önce her defasında bir işlevi taşımanızı, test ve doğrulama yapmanızı öneririz.

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

Firebase CLI'ın en az 12.00 ve firebase-functions olan 4.3.0 sürümünü kullandığınızdan emin olun. Yeni sürümler 2. nesle 1. nesli destekler.

İçe aktarmaları güncelleme

2. nesil işlevler, firebase-functions SDK'sındaki v2 alt paketinden içe aktarılır. Firebase CLI'ın, işlev kodunuzu 1. nesil işlev olarak mı yoksa 2. nesil işlev olarak mı dağıtacağını belirlemesi için gereken tek şey bu farklı içe aktarma yoludur.

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

Önce: 1. nesil

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

2. nesil sonrası

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

Tetikleyici tanımlarını güncelleme

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

Bazı tetikleyiciler için geri çağırma işlevlerine 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ğini unutmayın. 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) => {
    // ...
  });

2. nesil sonrası

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) => {
  /* ... */
});

Parametreleştirilmiş yapılandırma kullan

2. nesil işlevler, kod tabanınızda yapılandırma parametrelerinin bildirimli olarak tanımlanmasını sağlayan daha güvenli bir arayüz yerine functions.config desteği bırakıyor. Yeni params modülüyle CLI, tüm parametrelerin geçerli bir değeri olmadığı sürece dağıtımı engeller. Böylece bir işlevin eksik yapılandırmayla dağıtılmaması sağlanır.

params alt paketine taşıyın

Ortam yapılandırmasını functions.config ile kullanıyorsanız mevcut yapılandırmanızı parametreli 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);

  // ...
});

2. nesil sonrası

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 ayarlayın

İlk kez dağıtım yaptığınızda Firebase CLI, 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 denetimi sağlayan Cloud Secret Manager ile entegre olur. 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);
  // ...
});

2. nesil sonrası

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ırılması 1. ve 2. nesil arasında değişti. 2. nesil, tüm işlevler için seçenekleri ayarlama konusunda yeni bir özellik de ekliyor.

Ö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) => {
    // ...
  });

2. nesil sonrası

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şlevlerinin ö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ığı baştan başlatma sayısını önemli ölçüde azaltabilir. Eşzamanlılık varsayılan olarak 80'dir ancak 1 ile 1.000 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ı iyileştirebilir ve işlevlerin maliyetini azaltabilir. Eşzamanlı isteklere izin verme başlıklı makalede eşzamanlılık hakkında daha fazla bilgi edinebilirsiniz.

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

Eşzamanlılık göz önünde bulundurulmadan yazılan 1. nesil işlevler, her istekte ayarlanan ve okunan global değişkenler 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 genel değişkenleri aynı anda ayarlayıp okumaya başladığı için bu durum işlevinizde hatalara yol açabilir.

Yükseltme sırasında, 1. nesil davranışını geri yüklemek için işlevinizin CPU'sunu gcf_gen1 ve concurrency değerini 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 2. nesil işlevlerin performans avantajlarını ortadan kaldırdığı için bunun 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şlevlerine 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 yavaş yavaş taşımanız gerekir.

Aynı ada sahip bir işlevi 1. nesilden 2. nesle yükseltmek ve firebase deploy çalıştırmak mümkün değildir. Bu işlem şu hatayı döndürür:

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 ihtiyatlı olduğundan emin olun. Çünkü hem yeni sürüm hem de işlevinizin eski sürümü, değişiklik sırasında aynı anda aynı anda çalışacaktı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şlev ve bir kez 2. nesil işlevi tarafından yanıt vermenin iki kez yanıt verdiğinden emin olun. Bu durumda uygulamanız tutarlı bir durumda kalır.

  1. İşlevler kodunuzda işlevi yeniden adlandırın. Örneğin, resizeImage adını resizeImageSecondGen olarak değiştirin.
  2. İşlevi, hem orijinal 1. nesil fonksiyonu hem de 2. nesil fonksiyonu çalışacak şekilde dağıtın.
    1. Çağrılanabilir, 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. hem de 2. nesil işlevler dağıtımın hemen ardından her etkinliğe yanıt verir.
  3. Tüm trafik taşındığında firebase CLI'sinin 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ırın.