İş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, içindeki tüm işlevleri dağıtır kaynağınızı aynı anda dinleyebilirsiniz. Projenizde 5’ten fazla fonksiyon varsa --only işaretini belirli işlev adlarıyla kullanmanızı öneririz. fonksiyonları dağıtıp tıklayın. Belirli işlevleri dağıtma Bu şekilde dağıtım sürecini hızlandırır ve projenizle ilgili dağıtım kotaları. Ö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.

Mevcut tam liste için Firebase CLI referansına bakın komutlarının ikisine katlanır.

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 KSA'da açıkça
  • Google Cloud konsolunda açıkça gönderin.
  • 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 KSA'daki açık işlev silme, birden fazla bağımsız değişkeni destekler yanı sıra gruplar ve belirli bir bölgede çalışan bir işlev belirtmenizi sağlar. 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ılan tüm işlevleri üretimden kaldırır.

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

Bölgeleri yeniden adlandırıyor veya değiştiriyorsanız ya da istiyorsanız, verilerinizi kaybetmemek için bu bölümdeki adımları etkinlikleri görebilirsiniz. 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.

İşlevi 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, bir Node.js fonksiyonunuz varsa istediğiniz webhook adını webhookNew olarak değiştirmek için, kodu aşağıdaki gibi revize edin:

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

Belirli bir bölge için belirtilen bölgeleri başka bir fonksiyona sahipseniz, etkinlik kaybını önlemek için şu adımları izleyin:

  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, webhook adlı odada şu anda varsayılan işlevler bölgesini kullanıyorsanız ve bunu şuraya taşımak istiyorsunuz:us-central1 asia-northeast1, öncelikle işlev görmek ve revize etmek.

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

Bir iş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, Firebase Realtime Database türünü değiştirmek isteyebilirsiniz veya Cloud Firestore etkinliği başka türe.

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 durumda, hem eski hem de yeni işlev geçici olarak çalıştırılır.
  3. Eski işlevi Firebase KSA'yı kullanarak üretimden açık bir şekilde silin.

Örneğin, objectChanged adında eski onChange etkinlik türü ve onFinalize olarak değiştirmek istiyorsanız önce yeniden adlandırın işlevi 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 gibi çalışma zamanı seçeneklerini belirlemenize olanak tanır. çalışma zamanı sürümü ve işlev başına zaman aşımı, bellek ayırma ve minimum/maksimum işlev örneklerinden ibarettir.

En iyi uygulama olarak, bu seçeneklerin (Node.js sürümü hariç) yapılandırma nesnesini ifade eder. Bu RuntimeOptions nesne, fonksiyonunuzun çalışma zamanı seçenekleri için doğru kaynaktır ve Başka bir yöntemle (ör. Google Cloud Console aracılığıyla) belirlenen geçersiz kılma seçenekleri veya gcloud CLI) aracını kullanın.

Geliştirme iş akışınızda çalışma zamanı seçeneklerini Google Cloud konsolunu veya gcloud KSA'yı kullanıyorsanız ve bu değerlerin böyle olmasını istemiyorsanız her dağıtımda geçersiz kılınmışsa 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 ayarlandı: Harici değişiklikleri varsayılan değerle geçersiz kılın.
  3. Seçenek, işlev kodunda ayarlanmamış ancak şu anda dağıtılmış olan işlevde ayarlanmış: Dağıtılan işlevde belirtilen seçeneği kullanın.

preserveExternalChanges: true seçeneğinin kullanılması önerilmez çünkü çoğu senaryoda kodu artık çalışma zamanı seçeneklerinin tam veri kaynağı işlevlerine dahildir. 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 izin verir. Bir projedeki tüm işlevleri yalnızca çalışma zamanında çalıştırmayı seçebilirsiniz ortama nasıl aktarabilirsiniz?

  • 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ü, package.json tablosundaki engines alanından ayarlayabilirsiniz. başlatma sırasında functions/ dizininizde oluşturulan bir dosyadır. Örneğin, sürüm 18, bu satırı package.json ürününde 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, herhangi bir değer yerine firebase.json içinde ayarlanan değeri kullanır veya package.json içinde ayrı olarak ayarladığınız aralık.

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 KSA 11.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 sürüm 16'dan sürüm 18'e yükseltiyorsanız giriş şöyle görünmelidir: "engines": {"node": "18"}
  4. İsteğe bağlı olarak, değişikliklerinizi Firebase Local Emulator Suite.
  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 düşük gecikmeli bir deneyim gerektiriyorsa 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, örneklerin ölçeklenmesini sınırlamak için bir maksimum sayı ayarlayabilirsiniz: yanıt verebilir. 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 RuntimeOptions arayüz, minInstances değerini tanımlar. Örneğin, bu işlev hazır 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ın, ani trafik artışları olan uygulamalar üzerindeki en ciddi etkisi vardır. Eğer uygulamanızın ani trafiğe sahip olduğunu ve minInstances değerini, uygulamanızın her trafik artışında soğuk başlatmaların azalması söz konusu olduğunda, daha az gecikme. 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. Sıfıra ölçeklendirmek için ama yine de üretim projenizde baştan başlatma sayısını azaltırsanız minInstances, FIREBASE_CONFIG ortam değişkenine göre ayarlanabilir:

    // 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 örnek sayısını ayarlamak için runWith yöntemidir. Bu yöntem RuntimeOptions özelliklerini tanımlayan maxInstances için değerleri kullanın. Ö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ındı ve ardından şu yanıt koduyla reddedildi: O zamana kadar kullanılabilir örnek yoksa 429 Too Many Requests.

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şlevlerinizin uzun bir zaman aşımı için özel gereksinimleri olabilir. veya büyük bir bellek ayırması söz konusu. Bu değerleri, Google Cloud Console'da veya işlev kaynak kodunda (yalnızca Firebase).

İşlev kaynak kodunda bellek ayırmayı ve zaman aşımını ayarlamak için runWith parametresi, Firebase SDK'sında Cloud Functions 2.0.0 için kullanıma sunuldu. Bu çalışma zamanı seçeneği şuna uyan bir JSON nesnesidir: RuntimeOptions timeoutSeconds ve memory değerlerini tanımlayan arayüzdür. Ö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ı, ayrılan CPU'ya karşılık gelir. işlevine ilişkin değer memory için geçerli değerler listesinde açıklandığı şekilde yapılır:

  • 128MB — 200 MHz
  • 256MB — 400 MHz
  • 512MB — 800 MHz
  • 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üde 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.