İşlevleri yönetme


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

İşlev dağıtma

İşlevleri dağıtmak için şu Firebase KSA 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. Projenizde 5'ten fazla işlev varsa yalnızca düzenlediğiniz işlevleri dağıtmak için --only işaretini belirli işlev adlarıyla kullanmanızı öneririz. Bu şekilde belirli işlevleri dağıtmak dağıtım sürecini hızlandırır ve dağıtım kotalarına takılmanızı önler. Örneğin:

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

Çok sayıda işlev dağıtırken standart kotayı aşabilir ve HTTP 429 veya 500 hata mesajları alabilirsiniz. Bu sorunu çözmek için işlevleri 10 veya daha az sayıda grup halinde dağıtın.

Kullanılabilir komutların tam listesi için Firebase CLI referansına göz atın.

Varsayılan olarak Firebase CLI, kaynak kodu için functions/ klasörüne bakar. Dilerseniz kod tabanlarını veya birden fazla dosya grubunu işlevlere göre düzenleyebilirsiniz.

İşlevleri silin

Daha önce dağıtılan işlevleri aşağıdaki yöntemlerle silebilirsiniz:

  • functions:delete ile Firebase CLI'sinde açıkça
  • Google Cloud konsolunda açıkça etkinleştirin.
  • Dağıtım öncesinde işlevi kaynaktan kaldırarak dolaylı olarak.

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

Firebase CLI'de açık işlev silme, işlev gruplarının yanı sıra birden fazla bağımsız değişkeni destekler ve belirli bir bölgede çalışan bir işlev 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

firebase deploy, işlevleri örtülü olarak sildiğinde kaynağınızı 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ştirme

Üretim trafiğini yöneten işlevlerin bölgelerini veya tetikleyicisini yeniden adlandırıyor ya da değiştiriyorsanız değişiklik sırasında etkinlikleri kaybetmemek için bu bölümdeki adımları uygulayın. Bu adımları uygulamadan önce, işlevinizin hem yeni hem de eski sürümü değişiklik sırasında aynı anda çalışacağından işlevinizin tekil olduğundan emin olun.

İşlevleri yeniden adlandırma

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ı 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, webhook adlı bir Node.js işleviniz varsa ve bu işlevi webhookNew olarak değiştirmek istiyorsanız kodu aşağıdaki gibi düzeltin:

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

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

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

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 uygulayarak etkinlik kaybını önleyebilirsiniz:

  1. İşlevi yeniden adlandırın ve bölgesini veya bölgelerini istediğiniz gibi değiştirin.
  2. Yeniden adlandırılan işlevi dağıtın. Bu işlem, her iki bölge grubunda da geçici olarak aynı kodun çalıştırılmasına neden olur.
  3. Önceki işlevi silin.

Örneğin, şu anda us-central1'un varsayılan işlev bölgesinde bulunan webhook adlı bir işleviniz varsa ve bu işlevi asia-northeast1'ye taşımak istiyorsanız önce işlevi yeniden adlandırmak ve bölgeyi düzeltmek için kaynak kodunuzu değiştirmeniz gerekir.

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

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

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

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

Ardından şu komutu çalıştırarak dağıtın:

firebase deploy --only functions:webhookAsia

Artık çalışan iki aynı işlev var: webhook, us-central1'te, webhookAsia ise asia-northeast1'te çalışıyor.

Ardından webhook öğesini silin:

firebase functions:delete webhook

Artık yalnızca bir işlev var: asia-northeast1'te çalışan webhookAsia.

İşlevin tetikleyici 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 tetikleyici türünü değiştirmeniz gerekebilir. Örneğin, bir Firebase Realtime Database veya Cloud Firestore etkinliği türünü başka bir türe değiştirmek isteyebilirsiniz.

Bir işlevin etkinlik türünü değiştirmek için yalnızca kaynak kodunu değiştirip firebase deploy'ü çalıştırmak yeterli değildir. Hataları önlemek için bir işlevin tetikleyici türünü şu şekilde değiştirin:

  1. Kaynak kodunu, istenen tetikleyici türüne sahip yeni bir işlev içerecek şekilde değiştirin.
  2. İşlevi dağıtın. Bu işlem, hem eski hem de yeni işlevlerin geçici olarak çalıştırılmasına neden olur.
  3. Firebase İTŞ'yi kullanarak eski işlevi üretimden açıkça silin.

Örneğin, eski onChange etkinlik türüne sahip 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 etkinlik türüne sahip olacak şekilde düzenleyin.

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

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

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

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 ayarlama

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 örneği 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 kodunun içindeki bir yapılandırma nesnesinde ayarlanmalıdır. Bu RuntimeOptions nesnesi, işlevinizin çalışma zamanı seçenekleri için doğru kaynaktır ve diğer yöntemlerle (ör. Google Cloud Console veya gcloud CLI aracılığıyla) ayarlanan seçenekleri geçersiz kılar.

Geliştirme iş akışınız Google Cloud Console veya gcloud CLI aracılığıyla çalışma zamanı seçeneklerini manuel olarak ayarlamayı 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ılmış sürümünün ayarlarıyla aşağıdaki önceliğe göre birleştirir:

  1. İşlev kodunda seçenek ayarlanır: Harici değişiklikleri geçersiz kıl.
  2. Seçenek, işlev kodunda RESET_VALUE olarak ayarlanır: Harici değişiklikleri varsayılan değerle geçersiz kılar.
  3. Seçenek, işlev kodunda değil, şu anda dağıtılan işlevde ayarlanmıştır: Dağıtılan işlevde belirtilen seçeneği kullanın.

preserveExternalChanges: true seçeneği, kodunuz artık işlevlerinizin çalışma zamanı seçenekleri için tam doğruluk kaynağı olmayacağından çoğu senaryo için önerilmez. Bu özelliği kullanıyorsanız bir işlevin tam yapılandırmasını görüntülemek için Google Cloud Console'u kontrol edin veya gcloud CLI'yi kullanın.

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

Cloud Functions için Firebase SDK'sı, Node.js çalışma zamanı seçimine olanak tanır. Bir projedeki tüm işlevleri yalnızca aşağıdaki 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ünü, başlatma sırasında functions/ dizininizde oluşturulan package.json dosyasının engines alanında ayarlayabilirsiniz. Örneğin, yalnızca 18 sürümünü kullanmak için package.json'teki şu satırı düzenleyin:

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

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

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

CLI, package.json'te ayrı olarak ayarladığınız herhangi bir değere veya aralığa kıyasla firebase.json'te ayarlanan değeri kullanır.

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

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 v11.18.0 veya sonraki bir sürümü kullandığınızdan emin olun.
  3. İlk kullanıma hazırlama sırasında functions/ dizininizde oluşturulan package.json dosyasında engines değerini değiştirin. Örneğin, 16 sürümünden 18 sürümüne yükseltme yapıyorsanız giriş şu şekilde görünmelidir: "engines": {"node": "18"}
  4. İsterseniz Firebase Local Emulator Suite simgesini kullanarak değişikliklerinizi test edebilirsiniz.
  5. Tüm işlevleri yeniden dağıtın.

Ölçeklendirme davranışını kontrol etme

Varsayılan olarak Cloud Functions for Firebase, çalışan örneklerin sayısını gelen isteklerin sayısına göre ölçeklendirir. Trafik azaldığında örnek sayısını sıfıra kadar düşürebilir. Ancak uygulamanız için düşük gecikmeli bir deneyim gerekiyorsa ve soğuk başlatma sayısını sınırlamak istiyorsanız, etkin durumda tutulacak ve istek yayınlamaya 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çeklendirilmesini sınırlamak için maksimum bir sayı belirleyebilirsiniz. Bu ayarı, maliyetlerinizi kontrol etmek veya veritabanı gibi bir destek hizmetine yapılan bağlantı sayısını sınırlamak için kullanın.

Baştan başlatma sayısını azaltma

Kaynak kodunda 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 uygun bir JSON nesnesi kabul eder. Örneğin, bu işlev hazır durumda tutulacak 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 değer belirlerken dikkate almanız gereken bazı noktalar ş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 baştan başlatma işlemi gerçekleşir.
  • Soğuk başlatmalar, trafiği ani artışlar gösteren uygulamalar üzerinde en ciddi etkiye sahiptir. Uygulamanızda ani trafik artışları varsa ve her trafik artışında soğuk başlatmaları azaltacak kadar yüksek bir minInstances değeri belirlerseniz gecikmenin önemli ölçüde azaldığını görürsünüz. Sürekli trafiği olan uygulamalarda sıfırdan başlatmanın performansı ciddi şekilde etkilemesi olası değildir.
  • Minimum örnek sayısı belirlemek üretim ortamları için mantıklı olabilir ancak genellikle test ortamlarında bundan kaçınılmalıdır. Test projenizde sıfıra ölçeklendirme yapmak ancak üretim projenizdeki soğuk başlatmaları azaltmak için minInstances'yi FIREBASE_CONFIG ortam değişkenine göre 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şlevin maksimum örnek sayısını sınırlama

İşlev kaynak kodunda maksimum örneği ayarlamak için runWith yöntemini kullanın. Bu yöntem, maxInstances için değerleri tanımlayan RuntimeOptions arayüzüne uygun bir JSON nesnesi kabul eder. Örneğin, bu işlev varsayımsal bir eski veritabanını aşırı yüklememek 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 işlevi maxInstances sınırına kadar ölçeklendirilirse yeni istekler 30 saniye boyunca sıraya alınır ve bu süre içinde kullanılabilir bir örnek yoksa 429 Too Many Requests yanıt koduyla reddedilir.

Maksimum örnek sayısı ayarlarını kullanmayla ilgili en iyi uygulamalar hakkında daha fazla bilgi edinmek için maxInstances'i kullanmayla ilgili en iyi uygulamalara göz atın.

Zaman aşımı ve bellek tahsisi ayarlama

Bazı durumlarda, işlevleriniz için uzun bir zaman aşımı değeri veya büyük bir bellek tahsisi gibi özel şartlar olabilir. Bu değerleri Google Cloud Console'da veya işlev kaynak kodunda (yalnızca Firebase) ayarlayabilirsiniz.

İşlevlerin kaynak kodunda bellek ayırma ve zaman aşımı ayarlamak için Cloud Functions 2.0.0 için Firebase SDK'sında kullanıma sunulan runWith parametresini kullanın. Bu çalışma zamanı seçeneği, timeoutSeconds ve memory değerlerini tanımlayan RuntimeOptions arayüzüne uygun bir JSON nesnesi 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
    });

Maksimum timeoutSeconds değeri 540 veya 9 dakikadır. Bir işleve verilen bellek miktarı, memory için 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 konsolunda bellek tahsisini ve zaman aşımını ayarlamak için:

  1. Google Google Cloud konsolunda sol menüden Cloud Functions'ı seçin.
  2. İşlev listesinde adını tıklayarak bir işlev seçin.
  3. Üst menüdeki Düzenle simgesini tıklayın.
  4. Ayırı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 Diğer'i tıklayın ve Zaman aşımı metin kutusuna bir saniye sayısı girin.
  6. İşlevi güncellemek için Kaydet'i tıklayın.