İşlev dağıtımını ve çalışma zamanı seçeneklerini yönetin

Sen, dağıtmak, silebilir ve Firebase CLI komutlarını kullanarak fonksiyonlarını değiştirmek veya işlevleri kaynak kodunda çalışma süresi seçeneklerini ayarlayarak yapabilirsiniz.

dağıtma işlevleri

fonksiyonları dağıtmak için, bu Firebase CLI komutu çalıştırın:

firebase deploy --only functions

Varsayılan olarak, Firebase CLI içindeki fonksiyonların hepsi dağıtır index.js aynı anda. Projeniz 5'ten fazla işlevleri varsa, onu kullanmanızı öneririz --only düzenlediğiniz sadece fonksiyonları dağıtmak için belirli bir işlev adları ile bayrağı. Belirli işlevleri Dağıtma bu şekilde dağıtım işlemini hızlandırır ve Dağıtım kotaları çalışan önlemek yardımcı olur. Örneğin:

firebase deploy --only functions:addMessage,functions:makeUppercase

fonksiyonların çok sayıda dağıtırken, standart kota aşmak ve 429 veya 500 hata iletileri HTTP olabilir. Bu sorunu çözmek için 10 veya daha az gruplar halinde işlevlerini dağıtın.

Bkz Firebase CLI başvuru mevcut komutların tam listesi için.

Varsayılan olarak, Firebase CLI göründüğü functions/ kaynak kodu için klasörün. İsterseniz, şunları yapabilirsiniz işlevleri düzenlemek codebases veya dosyaların birden setlerle.

Sil fonksiyonlar

Daha önce bu yollarla işlevleri konuşlandırılmış silebilirsiniz:

  • Açıkça ile Firebase CLI functions:delete
  • Açıkça içinde Google Cloud Console .
  • implictly işlevini kaldırarak index.js dağıtmadan önce.

Tüm silme işlemleri üretimden işlevini çıkarmadan önce onaylayın isteyecektir.

Firebase CLI Açık fonksiyon silme birden fazla argüman yanı sıra fonksiyonları grupları destekler ve belirli bir bölgede çalışan bir işlev belirlemenizi sağlar. Ayrıca, onay istemini geçersiz kılabilir.

# Delete all functions that match the specified name in all regions.
firebase functions:delete myFunction
# Delete a specified function running in a specific region.
firebase functions:delete myFunction --region us-east-1
# Delete more than one function
firebase functions:delete myFunction myOtherFunction
# Delete a specified functions group.
firebase functions:delete groupA
# Bypass the confirmation prompt.
firebase functions:delete myFunction --force

Kapalı fonksiyon silinmesi ile firebase deploy ayrıştırır index.js üretimden ve silen dosyadan kaldırıldı herhangi fonksiyonlar.

Bir işlevin adını, bölge veya tetiği değiştirin

Eğer yeniden adlandırma veya üretim trafiğini ele işlevler için bölgeler veya tetiği değiştiriyorsanız, modifikasyon sırasında olayları kaybetmemek için bu bölümdeki adımları izleyin. Bu adımları izlemeden önce, ilk olarak işlev olmasını sağlamak İdempotent yeni sürümü ve fonksiyonun eski sürüm her iki değişiklik sırasında aynı anda çalışan edilecektir beri.

Bir fonksiyonu yeniden adlandırma

Bir fonksiyonu yeniden adlandırmak için bir işlevin yeni yeniden adlandırılan sürümünü oluşturmak index.js ve sonra çalıştırın iki ayrı dağıtım komutları. İlk komut Yeni adlandırılan fonksiyonu dağıtır ve ikinci komuta önce dağıtılan sürümünü kaldırır. Örneğin, adlı bir işlev varsa webhook de değiştirmek istediğinizi webhookNew aşağıdaki gibi kod revize:

// before
const functions = require('firebase-functions');

exports.webhook = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

// after
const functions = require('firebase-functions');

exports.webhookNew = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

Ardından yeni işlevi dağıtmak için aşağıdaki komutları çalıştırın:

# Deploy new function called webhookNew
firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both webhookNew and webhook are running

# Delete webhook
firebase functions:delete webhook

Bir işlevin bölge veya bölgeleri değiştirme

Belirtilen değiştiriyorsanız bölgeleri üretim trafiğini başa çıkıyor bir işlev için, sırayla aşağıdaki adımları gerçekleştirerek olay kaybını önleyebilir:

  1. işlevini Yeniden Adlandırma ve arzu olarak bölge veya bölgeleri değiştirmek.
  2. adını işlevi, geçici bölgelerin her iki takımdaki aynı kodu çalıştırarak sonuçları dağıtın.
  3. Bir önceki işlevini silin.

Eğer bir işlev çağrıldığında varsa Örneğin, webhook varsayılan fonksiyonları bölgede şu anda us-central1 ve bunu taşımak istediğiniz asia-northeast1 , önce işlevini yeniden adlandırmak için kaynak kodunu değiştirmek ve bölgeyi revize etmek gerek .

// before
const functions = require('firebase-functions');

exports.webhook = functions
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

// after
const functions = require('firebase-functions');

exports.webhookAsia = functions
    .region('asia-northeast1')
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

Sonra çalıştırarak dağıtmak:

firebase deploy --only functions:webhookAsia

Şimdi orada çalışan iki özdeş işlevler şunlardır: webhook çalışan us-central1 ve webhookAsia çalışan asia-northeast1 .

Ardından, silme webhook :

firebase functions:delete webhook

- Şimdi tek işlevi vardır webhookAsia , çalışan asia-northeast1 .

Bir işlevin tetik türünü değiştirme

Zamanla Firebase dağıtım için Bulut İşlevleri geliştirmek gibi, çeşitli nedenlerle bir işlevin tetik türünü değiştirmek gerekebilir. Örneğin, isteyebilirsiniz:

  • Eski depolama değiştirin onChange için olay onFinalize , onDelete , onArchive ve onMetadataUpdate . (Daha fazla bu konuda bilgi v1 veya v2 yükseltme kılavuzuna beta ).
  • Böyle jenerik olarak başka birine onWrite Gerçek Zamanlı Veritabanı veya Cloud Firestore olay türünden diğerine değiştirme OnWrite granül için olay onCreate olay.

Sadece kaynak kodunu değiştirmek ve çalıştırarak bir işlevin olay türünü değiştirmek mümkün değildir firebase deploy . Bu prosedür ile bir işlevin tetik türünü değiştirmek, hataları önlemek için:

  1. arzu edilen bir tetikleme türü ile yeni bir fonksiyon dahil etmek için kaynak kodunu değiştirin.
  2. Geçici hem eski hem de yeni işlevleri çalışan sonuçlanır işlevini dağıtın.
  3. Açıkça Firebase CLI kullanarak üretimden eski işlevini silin.

Eğer olsaydı Örneğin, bir işlev objectChanged o mirası vardır onChange olay türünü ve bunu değiştirmek istiyorum onFinalize ilk, şey var işlevini ve düzenle adlandırmak onFinalize olay türünü.

// before
const functions = require('firebase-functions');

exports.objectChanged = functions.storage.object().onChange((object) => {
    return console.log('File name is: ', object.name);
});

// after
const functions = require('firebase-functions');

exports.objectFinalized = functions.storage.object().onFinalize((object) => {
    return console.log('File name is: ', object.name);
});

Sonra yaşlı işlevini silmeden önce, ilk yeni işlevi oluşturmak için aşağıdaki komutları çalıştırın:

# Create new function objectFinalized
firebase deploy --only functions:objectFinalized

# Wait until deployment is done; now both objectChanged and objectFinalized are running

# Delete objectChanged
firebase functions:delete objectChanged

Set çalışma zamanı seçenekleri

Firebase için Bulut Fonksiyonlar böyle zaman aşımı, hafıza tahsisi ve minimum / maksimum işlev örnekleri node.js çalışma zamanı sürümü gibi ve başına fonksiyonu çalışma süresi seçeneklerini seçmenize olanak sağlar.

Set node.js versiyonu

Bulut Fonksiyonlar 2.0.0 ve üstü için Firebase SDK node.js çalışma zamanı bir seçim sağlar. Sen sadece aşağıdaki desteklenen node.js sürümlerinden birine tekabül çalışma zamanı çevre üzerinde projedeki tüm fonksiyonlarını çalıştırmak için tercih edebilirsiniz:

  • 16 node.js
  • 14 node.js
  • 12 node.js
  • 10 node.js
  • 8 node.js 15 Aralık'ta 8 çalışma zamanı Firebase CLI devre dışı edildi node.js fonksiyonların Dağıtım (8 Haziran 2020 tarihinde kullanımdan kaldırıldı) , önceden dağıtılan fonksiyonların 2020 Yürütme gelecekte bir noktada durur; Eğer node.js 8 çalışma zamanı işlevleri dağıtmış varsa, size tavsiye node.js 16 çalışma zamanı yükseltin .

Node.js sürümünü ayarlamak için:

Sürüm olarak ayarlayın engines alanda package.json sizin oluşturulan dosyanın functions/ başlatma sırasında dizinden. Örneğin, yalnızca sürüm 16, düzenleme bu hat kullanmak package.json :

  "engines": {"node": "16"}

engines alanı gerekiyor; dağıtmak ve çalıştırma fonksiyonları için sırayla desteklenen node.js sürümlerinden birini belirtmelisiniz . Şu firebase init functions olarak belirler bu alanı 16 .

senin node.js Çalışma zamanını Yükseltme

senin node.js Çalışma zamanını yükseltmek için:

  1. Emin olun proje üzerinde Blaze fiyatlandırma planı .
  2. Eğer Firebase CLI v9.17.0 kullanılarak ya da geç emin olun.
  3. Değişim engines değeri package.json sizin oluşturulan dosyanın functions/ başlatma sırasında dizinden. : Sürüm 16 sürüm 10 yükseltme yapıyorsanız Örneğin, giriş şu şekilde görünmelidir "engines": {"node": "16"}
  4. İsteğe bağlı olarak, kullanarak değişiklikleri test Firebase Yerel Emülatörü Suite .
  5. Daha sonra Firebase CLI v9.17.0 kullanarak veya Redeploy fonksiyonları.

Kontrol ölçekleme davranışı

Varsayılan olarak, Firebase için Bulut Fonksiyonlar potansiyel, gelen taleplerin sayısına dayalı örneklerini çalıştıran azaltılmış trafik zamanlarda sıfır örneklerine küçültme sayısını ölçekler. uygulama gecikmesi azalır ve soğuk başlar sayısını sınırlamak istiyor gerektirir Ancak, sen konteyner örnekleri az sayıda belirterek bu varsayılan davranışı değiştirebilirsiniz sıcak ve isteklere hizmet vermeye hazır tutulacak.

Benzer şekilde, gelen isteklere yanıt olarak örneklerinin ölçeklendirme sınırlamak için maksimum sayısını ayarlayabilirsiniz. maliyetlerinizi kontrol etmek veya böyle bir veritabanına gibi bir destek hizmetine bağlantı sayısını sınırlamak için bir yol olarak bu ayarı kullanın.

Soğuk başlama sayısını azaltın

Kaynak kodunda bir işlev için örnekleri kümesi minimum sayıda için kullanmak runWith parametresini. Bu çalışma zamanı seçenek uygun bir JSON nesne kabul RuntimeOptions değerini tanımlayan arayüzü minInstances . Örneğin, bu işlev sıcak tutmak için 5 örneklerinin minimum ayarlar:

exports.getAutocompleteResponse = functions
    .runWith({
      // Keep 5 instances warm for this latency-critical function
      minInstances: 5,
    })
    .https.onCall((data, context) => {
      // Autocomplete a user's search term
    });

İşte için bir değer ayarlarken dikkat etmeniz gereken bazı şeyler vardır minInstances :

  • Firebase için Bulut İşlevleri senin üstünde uygulamanızı ölçekler minInstances ayarında, o eşiğin üzerinde her örneği için soğuk bir başlangıç deneyim olacak.
  • Soğuk başlar dikenli trafik ile uygulamalarda en şiddetli etkiye sahiptir. Uygulamanız dikenli trafik olduğunda ve bir minInstances soğuk başlar her trafik artışı üzerinde azaldığı yeterince yüksek değerli, önemli ölçüde gecikme azalır görürsünüz. Sabit trafik ile uygulamalar için soğuk başlar ciddi olasılığı düşüktür performansını etkileyebilir.
  • Ayar asgari örneklerini üretim ortamları için mantıklı olabilir, ama genelde ortamları test kaçınılmalıdır. Belirleyebileceğiniz, test projesinde sıfıra ölçeğe ama hala üretim projesinde soğuk başlar azaltmak için minInstances dayalı FIREBASE_CONFIG ortam değişkeni:

    // Get Firebase project id from `FIREBASE_CONFIG` environment variable
    const envProjectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId;
    
    exports.renderProfilePage = functions
        .runWith({
          // Keep 5 instances warm for this latency-critical function
          // in production only. Default to 0 for test projects.
          minInstances: envProjectId === "my-production-project" ? 5 : 0,
        })
        .https.onRequest((req, res) => {
          // render some html
        });
    

Bir işlev için verilen maksimum sayısını sınırlama

Fonksiyon kaynak kodunda ayarlanan maksimum örnekleri için kullanın runWith parametresini. Bu çalışma zamanı seçenek uygun bir JSON nesne kabul RuntimeOptions değerlerini tanımlayan bir arayüz, maxInstances . Örneğin, bu fonksiyon varsayımsal eski veritabanını bunaltmayacak amacıyla 100 örneklerinin bir sınır ayarlar:

exports.mirrorOrdersToLegacyDatabase = functions
    .runWith({
      // Legacy database only supports 100 simultaneous connections
      maxInstances: 100,
    })
    .firestore.document("orders/{orderId}")
    .onWrite((change, context) => {
      // Connect to legacy database
    });

Bir HTTP fonksiyonu için çoğaltılır ise maxInstances sınırı, yeni istekler 30 saniye için sıraya koyulur ve daha sonra bir tepki koduyla reddedilen 429 Too Many Requests hiçbir örneği o zamana kadar mevcut ise.

Bunlara kontrol maksimum örneklerini ayarları kullanarak daha iyi uygulamalar hakkında bilgi edinmek için kullanımına ilişkin en iyi uygulamalar maxInstances .

Set zaman aşımı ve bellek ayırma

Bazı durumlarda, fonksiyonlar uzun zaman aşımı değeri veya büyük bir hafızaya tahsisi için özel gereksinimleri olabilir. (Yalnızca Firebase), Google Cloud Konsolu veya işlev kaynak kodunda ya bu değerleri ayarlayabilirsiniz.

Fonksiyonlar kaynak kodunda ayarlanan bellek tahsisi ve zaman aşımı için kullanmak runWith Bulut Fonksiyonlar 2.0.0 için Firebase SDK'sında bulunan parametre. Bu çalışma zamanı seçenek uygun bir JSON nesne kabul RuntimeOptions değerlerini tanımlayan bir arayüz, timeoutSeconds ve memory . Örneğin, bu depolama fonksiyonu 300 saniye sonra bellek ve kez 1GB kullanır:

exports.convertLargeFile = functions
    .runWith({
      // Ensure the function has enough memory and time
      // to process large files
      timeoutSeconds: 300,
      memory: "1GB",
    })
    .storage.object()
    .onFinalize((object) => {
      // Do some complicated things that take a lot of memory and time
    });

İçin en büyük değer timeoutSeconds olan 540 ya da 9 dakika. İçin geçerli değer bu listede ayrıntılı olarak, fonksiyon için ayrılan CPU bir işlev karşılık gelir tanınan bellek miktarı, memory :

  • 128MB - 200MHz
  • 256MB - 400 MHz
  • 512MB - 800 MHz
  • 1GB - 1.4 GHz
  • 2GB - 2,4 GHz
  • 4GB - 4.8 GHz
  • 8GB - 4.8 GHz

Google Bulut Konsolu bellek ayırmayı ve zaman aşımı ayarlamak için:

  1. Google, Google Cloud konsolunda sol menüden Bulut İşlevleri seçin.
  2. fonksiyonlar listesindeki adını tıklayarak bir işlev seçin.
  3. Üst menüde Düzenle simgesine tıklayın.
  4. Tahsis açılan menü etiketli Bellekten bir bellek ayırmayı seçin.
  5. Gelişmiş seçenekleri görüntülemek ve Zaman Aşımı metin kutusuna saniye sayısını girmek için fazla tıklayın.
  6. Fonksiyonunu güncellemek üzere Kaydet'i tıklayın.