Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

Firebase CLI komutlarını kullanarak veya işlevlerin kaynak kodunda çalışma zamanı seçeneklerini ayarlayarak işlevleri dağıtabilir, silebilir ve değiştirebilirsiniz.

İşlevleri dağıt

İşlevleri dağıtmak için şu Firebase CLI komutunu ç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

Çok sayıda işlevi dağıtırken standart kotayı aşabilir ve HTTP 429 veya 500 hata mesajları alabilirsiniz. Bunu çözmek için işlevleri 10 veya daha az kişilik gruplar halinde 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. İçeri aşağıdaki satırları ekleyerek başka bir klasör belirtebilirsiniz firebase.json :

"functions": {
  "source": "another-folder"
}

Fonksiyonları sil

Önceden dağıtılan işlevleri şu yollarla silebilirsiniz:

  • Açıkça ile Firebase CLI functions:delete
  • açıkça bağlam menüsünü kullanarak onksyonları Firebase konsolunda
  • implictly işlevini kaldırarak index.js dağıtmadan önce.

Tüm silme işlemleri, işlevi üretimden kaldırmadan önce onaylamanızı ister.

Firebase CLI'deki açık işlev silme, işlev gruplarının yanı sıra birden çok bağımsız değişkeni destekler ve belirli bir bölgede çalışan bir işlevi belirtmenize olanak tanır. Ayrıca, onay istemini geçersiz kılabilirsiniz.

# 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ölgesini veya tetikleyicisini değiştirin

Üretim trafiğini işleyen işlevler için bölgeleri veya tetikleyicileri yeniden adlandırıyor veya değiştiriyorsanız, değişiklik 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 işlevi yeniden adlandırın

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ılmış işlevi dağıtır ve ikinci komut, daha önce dağıtılan sürümü 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ölgesini veya bölgelerini 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. İşlevi yeniden adlandırın ve bölgesini veya bölgelerini istediğiniz gibi değiştirin.
  2. Her iki bölge kümesinde de aynı kodun geçici olarak çalıştırılmasına neden olan yeniden adlandırılan işlevi dağıtın.
  3. Önceki işlevi 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");
    });

Ardından aşağıdakileri çalıştırarak dağıtın:

$ 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

Cloud Functions for Firebase dağıtımınızı zaman içinde geliştirirken, çeşitli nedenlerle bir işlevin tetikleme türünü değiştirmeniz gerekebilir. Örneğin, şunları yapmak 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 Firebase 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 . Hatalardan kaçınmak için, bu prosedürle bir işlevin tetikleme türünü değiştirin:

  1. Kaynak kodunu, istenen tetikleyici türüyle yeni bir işlev içerecek şekilde değiştirin.
  2. Hem eski hem de yeni işlevlerin geçici olarak çalıştırılmasıyla sonuçlanan işlevi dağıtın.
  3. Firebase CLI'yi kullanarak eski işlevi üretimden açıkça 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);
});

Ardından, eski işlevi silmeden önce 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

Çalışma zamanı seçeneklerini ayarla

Firebase için Cloud Functions, Node.js çalışma zamanı sürümü ve işlev başına zaman aşımı, bellek ayırma ve minimum/maksimum işlev örnekleri gibi çalışma zamanı seçeneklerini belirlemenize olanak tanır.

Node.js sürümünü ayarla

Cloud Functions 2.0.0 ve üstü için Firebase SDK, Node.js çalışma zamanı seçimine izin verir. Bir projedeki tüm işlevleri yalnızca şu desteklenen Node.js sürümlerinden birine karşılık gelen çalışma zamanı ortamında çalıştırmayı seçebilirsiniz:

  • Node.js 16 (beta)
  • Node.js 14
  • Node.js 12
  • Node.js 10
  • 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 14 ç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 14, düzenleme bu hat kullanmak package.json :

  "engines": {"node": "14"}

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ı 14 .

Node.js çalışma zamanınızı yükseltin

Node.js çalışma zamanınızı yükseltmek için:

  1. Emin olun proje üzerinde Blaze fiyatlandırma planı .
  2. Firebase CLI v8.6.0 veya sonraki bir sürümünü kullandığınızdan 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 14 sürüm 10 yükseltme yapıyorsanız Örneğin, giriş şu şekilde görünmelidir "engines": {"node": "14"}
  4. İsteğe bağlı olarak, kullanarak değişiklikleri test Firebase Yerel Emülatörü Suite .
  5. Firebase CLI v8.1.0 veya sonraki sürümünü kullanarak işlevleri yeniden dağıtın.

Ölçekleme davranışını kontrol edin

Varsayılan olarak, Cloud Functions for Firebase, çalışan örneklerin sayısını gelen isteklerin sayısına göre ölçekler ve trafiğin azaldığı zamanlarda potansiyel olarak sıfır örneğe kadar ölçeklenir. Bununla birlikte, uygulamanız daha düşük gecikme süresi gerektiriyorsa ve soğuk başlatma sayısını sınırlamak istiyorsanız, sıcak tutulacak ve istekleri sunmaya hazır olacak minimum kapsayıcı örneği sayısını belirterek bu varsayılan davranışı değiştirebilirsiniz.

Benzer şekilde, gelen isteklere yanıt olarak örneklerin ölçeklenmesini sınırlamak için bir maksimum sayı belirleyebilirsiniz. Bu ayarı, maliyetlerinizi kontrol etmenin veya bir veritabanı gibi bir yedekleme hizmetine bağlantı sayısını sınırlamanın bir yolu olarak kullanın.

Soğuk çalıştırma 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 en az 5 örnek 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 ise minInstances ayarında, o eşiğin üzerinde her örneği için soğuk bir başlangıç deneyim olacak.
  • Soğuk başlatmalar, ani trafiğe sahip uygulamalar üzerinde en ciddi etkiye sahiptir. Uygulamanız dikenli trafik olduğunda ve bir ayarlarsanız 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. Sürekli trafiğe sahip uygulamalar için, soğuk başlatmaların performansı ciddi şekilde etkilemesi olası değildir.
  • Minimum örneklerin ayarlanması, üretim ortamları için anlamlı olabilir, ancak test ortamlarında genellikle bundan 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 maksimum örnek sayısını sınırlayın

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 işlev, varsayımsal bir eski veritabanını bunaltmamak için 100 örnek sınırı belirler:

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 .

Zaman aşımı ve bellek ayırmayı ayarla

Bazı durumlarda, işlevlerinizin uzun bir zaman aşımı değeri veya büyük bir bellek tahsisi için özel gereksinimleri olabilir. Bu değerleri Google Cloud Console'da veya işlev kaynak kodunda (yalnızca Firebase) 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 işlevi 1 GB bellek kullanır ve 300 saniye sonra zaman aşımına uğrar:

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ğerler memory şunlardır:

  • 128MB
  • 256MB
  • 512MB
  • 1GB
  • 2GB
  • 4GB
  • 8GB

Google Cloud Console'da bellek ayırma ve zaman aşımını ayarlamak için:

  1. Google, Google Cloud konsolunda sol menüden Bulut İşlevleri seçin.
  2. Fonksiyonlar listesinde ismine tıklayarak bir fonksiyon 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.