İşlevleri yönet


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ğıtma

İşlevleri dağıtmak için şu Firebase CLI komutunu çalıştırın:

firebase deploy --only functions

Varsayılan olarak Firebase CLI, kaynağınızdaki tüm işlevleri aynı anda dağıtır. Projeniz 5'ten fazla işlev içeriyorsa, yalnızca düzenlediğiniz işlevleri konuşlandırmak için --only işaretini belirli işlev adlarıyla 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örüne bakar. İsterseniz, işlevleri kod tabanlarında veya birden çok dosya kümesinde düzenleyebilirsiniz .

Silme işlevleri

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

  • açık bir şekilde Firebase CLI'de şu functions:delete
  • açıkça Google Cloud Konsolunda .
  • dağıtımdan önce işlevi kaynaktan 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ülü işlev silme ile, firebase deploy kaynağınızı ayrıştırır ve dosyadan kaldırılmış olan tüm işlevleri üretimden kaldırır.

Bir işlevin adını, bölgesini veya tetikleyicisini değiştirin

Üretim trafiğini yöneten 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, fonksiyonunuzun idempotent olduğundan emin olun, çünkü değişiklik sırasında fonksiyonunuzun hem yeni versiyonu hem de eski versiyonu aynı anda çalışacak.

Bir işlevi yeniden adlandırın

Bir işlevi yeniden adlandırmak için, kaynağınızda işlevin yeniden adlandırılmış yeni bir sürümünü oluşturun ve ardından iki ayrı konuşlandırma komutunu ç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, webhook adlı ve webhookNew olarak değiştirmek istediğiniz bir Node.js işleviniz varsa, kodu şu şekilde düzeltin:

// 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 yöneten 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. Aynı kodun her iki bölge grubunda da geçici olarak çalıştırılmasına neden olan yeniden adlandırılmış işlevi dağıtın.
  3. Önceki işlevi silin.

Örneğin, şu anda us-central1 varsayılan işlevler bölgesinde bulunan webhook adında bir işleviniz varsa ve bunu asia-northeast1 bölgesine taşımak istiyorsanız, işlevi yeniden adlandırmak ve bölgeyi revize etmek 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 çalıştırarak dağıtın:

firebase deploy --only functions:webhookAsia

Artık ç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 tetikleme 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, bir Firebase Gerçek Zamanlı Veritabanı veya Cloud Firestore etkinliği türünden başka bir türe geçmek isteyebilirsiniz.

Bir işlevin olay türünü yalnızca kaynak kodunu değiştirerek ve firebase deploy çalıştırarak değiştirmek mümkün değildir. Hatalardan kaçınmak için, bir işlevin tetikleme türünü şu prosedürle değiştirin:

  1. İstenen tetikleme türüyle yeni bir işlev eklemek için kaynak kodunu değiştirin.
  2. Hem eski hem de yeni işlevlerin geçici olarak çalıştırılmasına neden olan işlevi dağıtın.
  3. Firebase CLI'yi kullanarak eski işlevi açıkça üretimden silin.

Örneğin, eski onChange olay türüne sahip olan objectChanged adlı bir Node.js 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

Cloud Functions for Firebase, 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 seçmenize olanak tanır.

En iyi uygulama olarak, bu seçenekler (Node.js sürümü hariç) işlev kodu içindeki bir yapılandırma nesnesinde ayarlanmalıdır. Bu RuntimeOptions nesnesi, işlevinizin çalışma zamanı seçenekleri için gerçeğin kaynağıdır ve diğer herhangi bir yöntemle (Google Cloud konsolu veya gcloud CLI gibi) ayarlanan seçenekleri geçersiz kılar.

Geliştirme iş akışınız, çalışma zamanı seçeneklerinin Google Cloud konsolu veya gcloud CLI aracılığıyla manuel olarak ayarlanmasını içeriyorsa ve bu değerlerin her dağıtımda geçersiz kılınmasını istemiyorsanız , preserveExternalChanges seçeneğini true olarak ayarlayın. Bu seçenek true olarak ayarlandığında Firebase, kodunuzda ayarlanan çalışma zamanı seçeneklerini işlevinizin şu anda dağıtılan sürümünün ayarlarıyla aşağıdaki önceliğe göre birleştirir:

  1. Seçenek, işlev kodunda belirlenir: harici değişiklikleri geçersiz kıl.
  2. Seçenek, işlev kodunda RESET_VALUE olarak ayarlanmıştır: harici değişiklikleri varsayılan değerle geçersiz kılar.
  3. Seçenek, işlev kodunda ayarlanmadı, ancak şu anda dağıtılan işlevde ayarlandı: dağıtılan işlevde belirtilen seçeneği kullanın.

preserveExternalChanges: true seçeneğinin kullanılması çoğu senaryo için önerilmez çünkü kodunuz artık işlevleriniz için çalışma zamanı seçenekleri için tam doğruluk kaynağı olmayacaktır. Bunu kullanırsanız, bir işlevin tam yapılandırmasını görüntülemek için Google Cloud konsolunu kontrol edin veya gcloud CLI'yi kullanın.

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

Cloud Functions 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 20 (önizleme)
  • Node.js 18
  • Node.js 16
  • Node.js 14

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

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

  "engines": {"node": "18"}

Yarn paket yöneticisi kullanıyorsanız veya engines alanı için başka özel gereksinimleriniz varsa bunun yerine Firebase SDK for Cloud Functions için çalışma zamanını firebase.json ayarlayabilirsiniz:

  {
    "functions": {
      "runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
    }
  }

CLI, package.json içinde ayrıca ayarladığınız herhangi bir değer veya aralık yerine firebase.json ayarlanan değeri kullanır.

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 yer aldığından emin olun.
  2. Firebase CLI v11.18.0 veya üstü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 16'dan sürüm 18'e yükseltme yapıyorsanız, giriş şu şekilde görünmelidir: "engines": {"node": "18"}
  4. İsteğe bağlı olarak, Firebase Local Emulator Suite kullanarak değişikliklerinizi test edin.
  5. Tüm işlevleri yeniden dağıtın.

Python sürümünü ayarla

Firebase SDK for Cloud Functions sürümleri 12.0.0 ve üzeri, Python çalışma zamanının seçilmesine izin verir (genel önizleme işlevi için). Çalışma zamanı sürümünü firebase.json gösterildiği gibi ayarlayın:

  {
    "functions": {
      "runtime": "python310" // or python311
    }
  }

Ölçeklendirme 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çeklendirir ve trafiğin azaldığı zamanlarda ölçeği potansiyel olarak sıfır örneğe kadar düşürür. Bununla birlikte, uygulamanız azaltılmış gecikme gerektiriyorsa ve soğuk başlatma sayısını sınırlamak istiyorsanız, sıcak tutulacak ve istekleri sunmaya hazır olacak minimum sayıda kapsayıcı örneği belirleyerek 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 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 kodundaki bir işlev için minimum örnek sayısını ayarlamak üzere runWith yöntemini kullanın. Bu yöntem, minInstances değerini tanımlayan RuntimeOptions arayüzüne uyan bir JSON nesnesini kabul eder. Örneğin, bu işlev sıcak tutmak için en az 5 örneği 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 dikkate alınması gereken bazı şeyler şunlardır:

  • Cloud Functions for Firebase, uygulamanızı minInstances ayarınızın üzerine ö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 trafik varsa ve her trafik artışında soğuk başlatmaları azaltacak 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şlatmanın performansı ciddi şekilde etkilemesi olası değildir.
  • Minimum örneklerin ayarlanması, üretim ortamları için anlamlı olabilir, ancak genellikle test ortamlarında kaçınılmalıdır. Test projenizde sıfıra ölçeklendirmek, ancak yine de üretim projenizde soğuk başlatmaları azaltmak için, FIREBASE_CONFIG ortam değişkenine dayalı 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 yöntemini kullanın. Bu yöntem, maxInstances için değerleri tanımlayan RuntimeOptions arabirimiyle uyumlu bir JSON nesnesini kabul eder. Örneğin, bu işlev, varsayımsal bir eski veritabanını zorlamamak 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 ardından, o zamana kadar hiçbir örnek mevcut değilse 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 kullanımına ilişkin bu en iyi uygulamalara göz atın.

Zaman aşımını 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.

İşlev kaynak kodunda bellek ayırmayı ve zaman aşımını ayarlamak için Firebase SDK for Cloud Functions 2.0.0'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 arabirimiyle uyumlu 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 bu geçerli değerler 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ırmayı ve zaman aşımını ayarlamak için:

  1. Google Google Cloud Console'da soldaki menüden Cloud Functions'ı seçin.
  2. İşlevler listesinde adına tıklayarak bir işlev 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'ya tıklayın ve Zaman Aşımı metin kutusuna bir saniye girin.
  6. İşlevi güncellemek için Kaydet'e tıklayın.