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:
- İşlevi yeniden adlandırın ve bölgesini veya bölgelerini istediğiniz gibi değiştirin.
- 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.
- Ö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ındanonFinalize
,onDelete
,onArchive
veonMetadataUpdate
. ( 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:
- Kaynak kodunu, istenen tetikleyici türüyle yeni bir işlev içerecek şekilde değiştirin.
- Hem eski hem de yeni işlevlerin geçici olarak çalıştırılmasıyla sonuçlanan işlevi dağıtın.
- 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:
- Projenizin Blaze fiyatlandırma planında olduğundan emin olun.
- Firebase CLI v9.17.0 veya sonraki bir sürümünü kullandığınızdan emin olun.
- Başlatma sırasında
functions/
dizininizde oluşturulanpackage.json
dosyasındakiengines
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"}
- İsteğe bağlı olarak, değişikliklerinizi Firebase Local Emulator Suite kullanarak test edin.
- 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ı olarakminInstances
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:
- Google Google Bulut Konsolunda, soldaki menüden Bulut İşlevleri'ni seçin.
- Fonksiyonlar listesinde ismine tıklayarak bir fonksiyon seçin.
- Üst menüdeki Düzenle simgesini tıklayın.
- Ayrılan bellek etiketli açılır menüden bir bellek ayırma seçin.
- 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.
- İşlevi güncellemek için Kaydet'e tıklayın.