Check out what’s new from Firebase at Google I/O 2022. Learn more

İş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, index.js içindeki tüm işlevleri aynı anda dağıtır. Projeniz 5'ten fazla işlev içeriyorsa, yalnızca düzenlediğiniz işlevleri dağıtmak için belirli işlev adlarıyla --only işaretini kullanmanızı öneririz. Belirli işlevleri bu şekilde dağıtmak , dağıtım sürecini hızlandırır ve dağıtım kotalarına girmekten kaçınmanıza 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.

Kullanılabilir komutların tam listesi için Firebase CLI referansına bakın.

Varsayılan olarak, Firebase CLI, kaynak kodu için functions/ klasöre bakar. İsterseniz, işlevleri kod tabanlarında veya birden çok dosya kümesinde düzenleyebilirsiniz .

Fonksiyonları sil

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

  • açıkça Firebase CLI'de functions:delete
  • Firebase konsolundaki işlevler listesindeki bağlam menüsünü açıkça kullanarak
  • dağıtımdan önce işlevi index.js kaldırarak dolaylı olarak.

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

Örtük işlev silme ile, firebase deploy index.js ayrıştırır ve dosyadan kaldırılan tüm işlevleri üretimden kaldırır.

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ı uygulamadan önce, değişiklik sırasında işlevinizin hem yeni sürümü hem de eski sürümü aynı anda çalışacağından, önce işlevinizin idempotent olduğundan emin olun.

Bir işlevi yeniden adlandırın

Bir işlevi yeniden adlandırmak için, işlevin index.js yeniden adlandırılmış yeni bir sürümünü oluşturun ve ardından iki ayrı dağıtım komutu çalıştırın. İ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, webhookNew olarak değiştirmek istediğiniz webhook adlı bir işleviniz varsa, kodu aşağıdaki gibi gözden webhookNew :

// 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

Üretim trafiğini işleyen bir işlev için belirtilen bölgeleri değiştiriyorsanız, aşağıdaki adımları sırayla gerçekleştirerek olay kaybını önleyebilirsiniz:

  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.

Örneğin, şu anda us-central1 varsayılan işlevler bölgesinde bulunan webhook adlı bir işleviniz varsa ve bunu asia-northeast1 northeast1 öğesine taşımak istiyorsanız, işlevi yeniden adlandırmak ve bölgeyi gözden geçirmek için önce kaynak kodunuzu değiştirmeniz gerekir. .

// 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 çalışan iki özdeş işlev var: webhook us-central1 içinde çalışıyor ve webhookAsia asia-northeast1 içinde çalışıyor.

Ardından, webhook silin:

firebase functions:delete webhook

Artık tek bir işlev var - asia-northeast1 çalışan webhookAsia .

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 onChange olayından onFinalize , onDelete , onArchive ve onMetadataUpdate . ( Betadan v1'e veya v2'ye yükseltme kılavuzunda bununla ilgili daha fazla bilgi edinin).
  • Bir tür Firebase Realtime Database veya Cloud Firestore olayı türünden, genel onWrite olayı gibi ayrıntılı onCreate olayına geçiş gibi bir diğerine geçin.

Yalnızca kaynak kodunu değiştirerek ve firebase deploy çalıştırarak bir işlevin olay türünü değiştirmek mümkün değildir. 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.

Örneğin, eski onChange olay türüne sahip bir objectChanged işleviniz varsa ve bunu onFinalize olarak değiştirmek istiyorsanız, önce işlevi yeniden adlandırın ve onFinalize olay türüne sahip olacak şekilde düzenleyin.

// 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:

  • Düğüm.js 16
  • Node.js 14
  • Node.js 12
  • Node.js 10
  • Node.js 8 (8 Haziran 2020'de kullanımdan kaldırıldı) 15 Aralık 2020'de Firebase CLI'de işlevlerin Node.js 8 çalışma zamanına dağıtımı devre dışı bırakıldı. Zaten dağıtılmış işlevlerin yürütülmesi gelecekte bir noktada duracak; Node.js 8 çalışma zamanına işlevler dağıttıysanız , Node.js 16 çalışma zamanına yükseltme yapmanızı öneririz.

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

Başlatma sırasında functions/ dizininizde oluşturulan package.json dosyasındaki engines alanında sürümü ayarlayın. Örneğin, yalnızca sürüm 16'yı kullanmak için bu satırı package.json dosyasında düzenleyin:

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

engines alanı gereklidir; işlevleri dağıtmanız ve çalıştırmanız için desteklenen Node.js sürümlerinden birini belirtmelidir . Şu anda firebase init functions bu alanı 16 olarak ayarlar.

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

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

  1. Projenizin Blaze fiyatlandırma planında olduğundan emin olun.
  2. Firebase CLI v9.17.0 veya sonraki bir sürümünü kullandığınızdan emin olun.
  3. Başlatma sırasında functions/ dizininizde oluşturulan package.json dosyasındaki engines değerini değiştirin. Örneğin, sürüm 10'dan sürüm 16'ya yükseltiyorsanız, giriş şöyle görünmelidir: "engines": {"node": "16"}
  4. İsteğe bağlı olarak, değişikliklerinizi Firebase Local Emulator Suite kullanarak test edin.
  5. Firebase CLI v9.17.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çeklendirir. Bununla birlikte, uygulamanız azaltılmış 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 minimum örnek sayısını ayarlamak için runWith parametresini kullanın. Bu çalışma zamanı seçeneği, minInstances değerini tanımlayan RuntimeOptions arabirimine uygun bir JSON nesnesini kabul eder. Ö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
    });

minInstances için bir değer ayarlarken göz önünde bulundurulması gereken bazı noktalar şunlardır:

  • Firebase için Cloud Functions, uygulamanızı minInstances ayarınızın üzerinde ölçeklendirirse, bu eşiğin üzerindeki her örnek için soğuk bir başlangıç ​​yaşarsınız.
  • Soğuk başlatmalar, ani trafiğe sahip uygulamalar üzerinde en ciddi etkiye sahiptir. Uygulamanızda ani bir trafik varsa ve her trafik artışında soğuk başlatmaların azalmasını sağlayacak kadar yüksek bir minInstances değeri ayarlarsanız, gecikme süresinin önemli ölçüde azaldığını 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 örnekleri ayarlamak, üretim ortamları için anlamlı olabilir, ancak test ortamlarında genellikle bundan kaçınılmalıdır. Test projenizde sıfıra ölçeklendirmek ama yine de üretim projenizde soğuk başlatmaları azaltmak için, FIREBASE_CONFIG ortam değişkenine dayalı olarak minInstances ayarlayabilirsiniz:

    // 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

İşlev kaynak kodunda maksimum örnekleri ayarlamak için runWith parametresini kullanın. Bu çalışma zamanı seçeneği, maxInstances için değerleri tanımlayan RuntimeOptions arabirimine uyan bir JSON nesnesini kabul eder. Örneğin, bu işlev, varsayımsal bir eski veritabanını bunaltmamak için 100 örneklik bir 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 işlevi maxInstances sınırına kadar ölçeklenirse, yeni istekler 30 saniye boyunca kuyruğa alınır ve o zamana kadar kullanılabilir örnek yoksa 429 Too Many Requests yanıt koduyla reddedilir.

Maksimum örnek ayarlarını kullanmaya yönelik en iyi uygulamalar hakkında daha fazla bilgi edinmek için maxInstances yönelik bu en iyi uygulamalara göz atın .

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.

İşlevlerin kaynak kodunda bellek ayırmayı ve zaman aşımını ayarlamak için, Cloud Functions 2.0.0 için Firebase SDK'da tanıtılan runWith parametresini kullanın. Bu çalışma zamanı seçeneği, timeoutSeconds ve memory için değerleri tanımlayan RuntimeOptions arabirimine uygun bir JSON nesnesini kabul eder. Ö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
    });

timeoutSeconds için maksimum değer 540 veya 9 dakikadır. Bir işleve verilen bellek miktarı, memory için geçerli değerlerin bu listesinde ayrıntılı olarak açıklandığı gibi, işlev için ayrılan CPU'ya karşılık gelir:

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

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

  1. Google Google Bulut Konsolunda, soldaki menüden Bulut İşlevleri'ni seçin.
  2. Fonksiyonlar listesinde ismine tıklayarak bir fonksiyon seçin.
  3. Üst menüdeki Düzenle simgesini tıklayın.
  4. Ayrılan bellek etiketli açılır menüden bir bellek ayırma seçin.
  5. Gelişmiş seçenekleri görüntülemek için Daha Fazla'yı tıklayın ve Zaman Aşımı metin kutusuna bir kaç saniye girin.
  6. İşlevi güncellemek için Kaydet'e tıklayın.