Sen, dağıtmak, silebilir ve Firebase CLI komutlarını kullanarak fonksiyonlarını değiştirmek veya işlevleri kaynak kodunda çalışma süresi seçeneklerini ayarlayarak yapabilirsiniz.
dağıtma işlevleri
fonksiyonları dağıtmak için, bu Firebase CLI komutu ç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
fonksiyonların çok sayıda dağıtırken, standart kota aşmak ve 429 veya 500 hata iletileri HTTP olabilir. Bu sorunu çözmek için 10 veya daha az gruplar halinde işlevlerini 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. İsterseniz, şunları yapabilirsiniz işlevleri düzenlemek codebases veya dosyaların birden setlerle.
Sil fonksiyonlar
Daha önce bu yollarla işlevleri konuşlandırılmış silebilirsiniz:
- Açıkça ile Firebase CLI
functions:delete
- Açıkça içinde Google Cloud Console .
- implictly işlevini kaldırarak
index.js
dağıtmadan önce.
Tüm silme işlemleri üretimden işlevini çıkarmadan önce onaylayın isteyecektir.
Firebase CLI Açık fonksiyon silme birden fazla argüman yanı sıra fonksiyonları grupları destekler ve belirli bir bölgede çalışan bir işlev belirlemenizi sağlar. Ayrıca, onay istemini geçersiz kılabilir.
# 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ölge veya tetiği değiştirin
Eğer yeniden adlandırma veya üretim trafiğini ele işlevler için bölgeler veya tetiği değiştiriyorsanız, modifikasyon 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 fonksiyonu yeniden adlandırma
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ılan fonksiyonu dağıtır ve ikinci komuta önce dağıtılan sürümünü 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ölge veya bölgeleri 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:
- işlevini Yeniden Adlandırma ve arzu olarak bölge veya bölgeleri değiştirmek.
- adını işlevi, geçici bölgelerin her iki takımdaki aynı kodu çalıştırarak sonuçları dağıtın.
- Bir önceki işlevini 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");
});
Sonra çalıştırarak dağıtmak:
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
Zamanla Firebase dağıtım için Bulut İşlevleri geliştirmek gibi, çeşitli nedenlerle bir işlevin tetik türünü değiştirmek gerekebilir. Örneğin, isteyebilirsiniz:
- Eski depolama değiştirin
onChange
için olayonFinalize
,onDelete
,onArchive
veonMetadataUpdate
. (Daha fazla bu konuda bilgi v1 veya v2 yükseltme kılavuzuna beta ). - Böyle jenerik olarak başka birine
onWrite
Gerçek Zamanlı Veritabanı veya Cloud Firestore olay türünden diğerine değiştirme OnWrite granül için olayonCreate
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
. Bu prosedür ile bir işlevin tetik türünü değiştirmek, hataları önlemek için:
- arzu edilen bir tetikleme türü ile yeni bir fonksiyon dahil etmek için kaynak kodunu değiştirin.
- Geçici hem eski hem de yeni işlevleri çalışan sonuçlanır işlevini dağıtın.
- Açıkça Firebase CLI kullanarak üretimden eski işlevini 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);
});
Sonra yaşlı işlevini silmeden önce, ilk 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
Set çalışma zamanı seçenekleri
Firebase için Bulut Fonksiyonlar böyle zaman aşımı, hafıza tahsisi ve minimum / maksimum işlev örnekleri node.js çalışma zamanı sürümü gibi ve başına fonksiyonu çalışma süresi seçeneklerini seçmenize olanak sağlar.
Set node.js versiyonu
Bulut Fonksiyonlar 2.0.0 ve üstü için Firebase SDK node.js çalışma zamanı bir seçim sağlar. Sen sadece aşağıdaki desteklenen node.js sürümlerinden birine tekabül çalışma zamanı çevre üzerinde projedeki tüm fonksiyonlarını çalıştırmak için tercih edebilirsiniz:
- 16 node.js
- 14 node.js
- 12 node.js
- 10 node.js
- 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 16 ç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 16, düzenleme bu hat kullanmak package.json
:
"engines": {"node": "16"}
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ı 16
.
senin node.js Çalışma zamanını Yükseltme
senin node.js Çalışma zamanını yükseltmek için:
- Emin olun proje üzerinde Blaze fiyatlandırma planı .
- Eğer Firebase CLI v9.17.0 kullanılarak ya da geç emin olun.
- Değişim
engines
değeripackage.json
sizin oluşturulan dosyanınfunctions/
başlatma sırasında dizinden. : Sürüm 16 sürüm 10 yükseltme yapıyorsanız Örneğin, giriş şu şekilde görünmelidir"engines": {"node": "16"}
- İsteğe bağlı olarak, kullanarak değişiklikleri test Firebase Yerel Emülatörü Suite .
- Daha sonra Firebase CLI v9.17.0 kullanarak veya Redeploy fonksiyonları.
Kontrol ölçekleme davranışı
Varsayılan olarak, Firebase için Bulut Fonksiyonlar potansiyel, gelen taleplerin sayısına dayalı örneklerini çalıştıran azaltılmış trafik zamanlarda sıfır örneklerine küçültme sayısını ölçekler. uygulama gecikmesi azalır ve soğuk başlar sayısını sınırlamak istiyor gerektirir Ancak, sen konteyner örnekleri az sayıda belirterek bu varsayılan davranışı değiştirebilirsiniz sıcak ve isteklere hizmet vermeye hazır tutulacak.
Benzer şekilde, gelen isteklere yanıt olarak örneklerinin ölçeklendirme sınırlamak için maksimum sayısını ayarlayabilirsiniz. maliyetlerinizi kontrol etmek veya böyle bir veritabanına gibi bir destek hizmetine bağlantı sayısını sınırlamak için bir yol olarak bu ayarı kullanın.
Soğuk başlama 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 5 örneklerinin minimum 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
minInstances
ayarında, o eşiğin üzerinde her örneği için soğuk bir başlangıç deneyim olacak. - Soğuk başlar dikenli trafik ile uygulamalarda en şiddetli etkiye sahiptir. Uygulamanız dikenli trafik olduğunda ve bir
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. Sabit trafik ile uygulamalar için soğuk başlar ciddi olasılığı düşüktür performansını etkileyebilir. Ayar asgari örneklerini üretim ortamları için mantıklı olabilir, ama genelde ortamları test 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 verilen maksimum sayısını sınırlama
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 fonksiyon varsayımsal eski veritabanını bunaltmayacak amacıyla 100 örneklerinin bir sınır ayarlar:
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
.
Set zaman aşımı ve bellek ayırma
Bazı durumlarda, fonksiyonlar uzun zaman aşımı değeri veya büyük bir hafızaya tahsisi için özel gereksinimleri olabilir. (Yalnızca Firebase), Google Cloud Konsolu veya işlev kaynak kodunda ya bu değerleri 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 fonksiyonu 300 saniye sonra bellek ve kez 1GB kullanır:
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ğer bu listede ayrıntılı olarak, fonksiyon için ayrılan CPU bir işlev karşılık gelir tanınan bellek miktarı, memory
:
-
128MB
- 200MHz -
256MB
- 400 MHz -
512MB
- 800 MHz -
1GB
- 1.4 GHz -
2GB
- 2,4 GHz -
4GB
- 4.8 GHz -
8GB
- 4.8 GHz
Google Bulut Konsolu bellek ayırmayı ve zaman aşımı ayarlamak için:
- Google, Google Cloud konsolunda sol menüden Bulut İşlevleri seçin.
- fonksiyonlar listesindeki adını tıklayarak bir işlev seçin.
- Üst menüde Düzenle simgesine tıklayın.
- Tahsis açılan menü etiketli Bellekten bir bellek ayırmayı seçin.
- 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.
- Fonksiyonunu güncellemek üzere Kaydet'i tıklayın.