1. nesil Node.js işlevlerini 2. nesle yükseltme

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

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

Taşıma süreci

1. nesil ve 2. nesil işlevler, aynı dosyada yan yana olabilir. Bu siz hazır olduğunuzda taşımayı adım adım gerçekleştirebilirsiniz. Önerilerimiz: aynı anda tek bir işlevi taşımak, test ve doğrulama gerçekleştirmek devam ediyor.

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

En az 12.00 Firebase CLI sürümü ve firebase-functions sürüm 4.3.0. Daha yeni bir sürüm, 1. nesil

İçe aktarmaları güncelleme

2. nesil işlevler, firebase-functions SDK'sındaki v2 alt paketinden içe aktarılır. Bu farklı içe aktarma yolu, Firebase CLI'ın aşağıdakileri yapıp yapmayacağını belirlemesi için yeterlidir: işlev kodunuzu 1. veya 2. nesil fonksiyon olarak dağıtın.

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

Önce: 1. nesil

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

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ı desteklediğinden tetikleyici tanımlarını önceki adımda yapılan değiştirilmiş içe aktarmaları yansıtır.

Bazı tetikleyiciler için geri çağırma işlevlerine iletilen bağımsız değişkenler değişti. Burada örnek, onDocumentCreated geri çağırma işlevinin bağımsız değişkenlerinin tek bir event nesnesinde birleştirilir. Ayrıca, bazı tetikleyiciler onRequest tetikleyicisinin cors gibi kullanışlı yeni yapılandırma özellikleri seçeneğini belirleyin.

Önce: 1. nesil

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

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

functions.config üzerinde ortam yapılandırmasını kullanıyorsanız mevcut yapılandırmanızı parametreleştirilmiş yapılandırma.

Önce: 1. nesil

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

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, parametrelerinden birini seçin ve değerleri bir dotenv dosyasına kaydedin. fonksiyonlar.config değerleri 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ü, Cloud Secret Manager ile entegre olur. için ayrıntılı erişim denetimi sunar. Görüntüleyin gizli parametreler konulu videomuzu izleyin.

Önce: 1. nesil

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

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ırması 1. ve 2. nesil arasında değişti. 2. nesil, TV'ye yeni bir özellik ekliyor. tüm işlevler için seçenekleri ayarlayın.

Önce: 1. nesil

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

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 fonksiyonların önemli bir avantajı, tek bir işlevin aynı anda birden fazla istek sunmasını sağlar. Bu durum, performansı önemli ölçüde azaltmanıza son kullanıcıların yaşadığı baştan başlatma sayısı. Eşzamanlılık varsayılan olarak 80'e 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ı 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, global değişkenler kullanabilir Bunlar her istek için ayarlanır ve okunmalıdır. Eşzamanlılık etkinleştirildiğinde ve tek bir aynı anda birden fazla isteği işlemeye başladığında işleviniz, eş zamanlı istekler olarak genel değişkenleri ayarlamaya ve okumaya başlar olanak tanır.

Yükseltme yaparken işlevinizin CPU'sunu gcf_gen1 olarak ayarlayabilir ve concurrency değerini ayarlayabilirsiniz 1. nesil davranışını geri yüklemek için 1 olarak güncelleyin:

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ından bahsedeceğiz. Bunun yerine, değişkenlerinizi kontrol edin ve çalışırken bu geçici ayarları kaldırın. hazır.

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 vermek üzere iki kez yanıt vermeniz durumunda 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.