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, 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 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 Firebase konsolundaki işlevler listesindeki bağlam menüsünü 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
konuşlandırması index.js
ayrıştırır ve dosyadan kaldırılmış 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 index.js
işlevin yeniden adlandırılmış yeni bir sürümünü oluşturun ve ardından iki ayrı dağıtım 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
adında, webhookNew
olarak değiştirmek istediğiniz bir işleviniz varsa, kodu şu şekilde düzenleyin:
// before
const {onRequest} = require('firebase-functions/v2/https');
exports.webhook = onRequest((req, res) => {
res.send("Hello");
});
// after
const {onRequest} = require('firebase-functions/v2/https');
exports.webhooknew = 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:
- İşlevi yeniden adlandırın ve bölgesini veya bölgelerini istediğiniz gibi değiştirin.
- 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.
- Ö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 {onRequest} = require('firebase-functions/v2/https');
exports.webhook = onRequest((req, res) => {
res.send("Hello");
});
// after
const {onRequest} = require('firebase-functions/v2/https');
exports.webhookasia = onRequest({
region: 'asia-northeast1'
}, (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: us-central1
webhook
çalışıyor ve asia-northeast1
webhookasia
ç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 tür Firebase Gerçek Zamanlı Veritabanı veya Cloud Firestore olayından, genel onWrite
olayından parçalı onCreate
olayına geçiş gibi başka bir olaya 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:
- İstenen tetikleme türüyle yeni bir işlev eklemek için kaynak kodunu değiştirin.
- Hem eski hem de yeni işlevlerin geçici olarak çalıştırılmasına neden olan işlevi dağıtın.
- Firebase CLI'yi kullanarak eski işlevi açıkça üretimden silin.
Örneğin, eski onMetadataUpdated
olay türüne sahip bir objectchanged
işleviniz varsa ve bunu onObjectFinalized
olarak değiştirmek istiyorsanız, önce işlevi yeniden adlandırın ve onObjectFinalized
olay türüne sahip olacak şekilde düzenleyin.
// before
const {onMetadataUpdated} = require('firebase-functions/v2/storage');
exports.objectchanged = onMetadataUpdated((event) => {
return console.log('File name is: ', event.data.name);
});
// after
const {onObjectFinalized} = require('firebase-functions/v2/storage');
exports.objectchanged = onObjectFinalized((event) => {
return console.log('File name is: ', event.data.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:
- Seçenek, işlev kodunda belirlenir: harici değişiklikleri geçersiz kıl.
- Seçenek, işlev kodunda
RESET_VALUE
olarak ayarlanmıştır: harici değişiklikleri varsayılan değerle geçersiz kılar. - 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 (2. nesil) 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 16
- Node.js 14
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 package.json
bu satırı düzenleyin:
"engines": {"node": "16"}
engines
alanı gereklidir; işlevleri dağıtabilmeniz ve çalıştırabilmeniz için desteklenen Node.js sürümlerinden birini belirtmesi gerekir . Şu anda firebase init functions
bu alanı 16
olarak ayarlıyor.
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 yer aldığından emin olun.
- Firebase CLI v9.17.0 veya üstü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ükseltme yapıyorsanız, giriş şöyle görünmelidir:"engines": {"node": "16"}
- Firebase CLI v9.17.0 veya üstünü kullanarak işlevleri yeniden dağıtın.
Ö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.
Bu ayarları örnek başına eşzamanlılık ayarıyla (2. nesilde yeni) birlikte kullanarak, işlevleriniz için ölçeklendirme davranışını kontrol edebilir ve ayarlayabilirsiniz. Uygulamanızın ve işlevinizin doğası, hangi ayarların en uygun maliyetli olduğunu belirleyecek ve en iyi performansla sonuçlanacaktır.
Düşük trafiğe sahip bazı uygulamalar için çoklu eşzamanlılık olmadan daha düşük bir CPU seçeneği idealdir. Soğuk başlatmaların kritik bir sorun olduğu diğerleri için, yüksek eş zamanlılık ve minimum bulut sunucusu ayarlamak, trafikteki büyük artışların üstesinden gelmek için bir dizi bulut sunucusunun her zaman sıcak tutulması anlamına gelir.
Çok az trafik alan daha küçük ölçekli uygulamalar için, yüksek eş zamanlılığa sahip düşük maksimum örneklerin ayarlanması, uygulamanın aşırı maliyetlere yol açmadan trafik patlamalarını kaldırabileceği anlamına gelir.
Eşzamanlı isteklere izin ver
Cloud Functions for Firebase'de (1. nesil), her örnek aynı anda bir isteği işleyebildiğinden ölçeklendirme davranışı yalnızca minInstances
ve maxInstances
ayarlarıyla ayarlandı. Örnek sayısını kontrol etmenin yanı sıra, Cloud Functions for Firebase'de (2. nesil), concurrency
seçeneğiyle her bir örneğin aynı anda sunabileceği istek sayısını denetleyebilirsiniz. Eşzamanlılık için varsayılan değer 80'dir, ancak bunu 1 ile 1000 arasında herhangi bir tamsayıya ayarlayabilirsiniz.
Daha yüksek eşzamanlılık ayarlarına sahip işlevler, her örneğin bir miktar boşluk payı olması muhtemel olduğundan, soğuk başlatma olmaksızın ani trafik artışlarını emebilir. Bir bulut sunucusu, 50 adede kadar eşzamanlı isteği işleyecek şekilde yapılandırılmışsa ancak şu anda yalnızca 25 isteği işliyorsa, soğuk başlatma için yeni bir eşgörünüm gerektirmeden 25 ek isteğin ani artışını işleyebilir. Buna karşılık, yalnızca 1'lik bir eşzamanlılık ayarıyla, isteklerdeki bu ani artış 25 soğuk başlatmaya neden olabilir.
Cloud Functions for Firebase'de (2. nesil) daha yüksek eşzamanlılık ayarlarıyla denemeler yaparken aşağıdakileri aklınızda bulundurun:
- Daha yüksek eşzamanlılık ayarları, pratik bir sınıra ulaşana kadar optimum performans için daha yüksek CPU ve RAM gerektirebilir. Örneğin, ağır görüntü veya video işleme yapan bir işlev, CPU ve RAM ayarları en üst düzeye çıkarıldığında bile 1000 eşzamanlı isteği işlemek için gereken kaynaklardan yoksun olabilir.
- Firebase için Cloud Functions (2. nesil), Cloud Run tarafından desteklendiğinden, eşzamanlılığı optimize etmek için Google Cloud kılavuzuna da başvurabilirsiniz.
- Üretimde çoklu eşzamanlılığa geçmeden önce çoklu eşzamanlılığı bir test ortamında kapsamlı bir şekilde test ettiğinizden emin olun.
Soğuk çalıştırma sayısını azaltın
Kaynak kodunda bir işlev için minimum örnek sayısını ayarlamak üzere minInstances
seçeneğini kullanın. Örneğin, bu işlev sıcak tutmak için en az 5 örnek ayarlar:
const { onCall } = require("firebase-functions/v2/https");
exports.getAutocompleteResponse = onCall(
{
// Keep 5 instances warm for this latency-critical function
minInstances: 5,
},
(event) => {
// Autocomplete 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 = onRequest( { // 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, }, (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 maxInstances
seçeneğini kullanın. Örneğin, bu işlev, varsayımsal bir eski veritabanını zorlamamak için 100 örneklik bir sınır belirler:
const { onMessagePublished } = require("firebase-functions/v2/pubsub");
exports.mirrorevents = onMessagePublished(
{ topic: "topic-name", maxInstances: 100 },
(event) => {
// 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, işlevlerinizi çalıştıran sanal makineyi özelleştirmek için GlobalOptions.memory
ve GlobalOptions.timeoutSeconds
kullanın. Örneğin, bu Bulut Depolama işlevi 1 GiB bellek kullanır ve 300 saniye sonra zaman aşımına uğrar:
exports.convertLargeFile = onObjectFinalized({
timeoutSeconds: 300,
memory: "1GiB",
}, (event) => {
// Do some complicated things that take a lot of memory and time
});
timeoutSeconds
için maksimum değer 540
veya 9 dakikadır.
Google Cloud Console'da bellek ayırmayı ve zaman aşımını ayarlamak için:
- Google Cloud Console'da soldaki menüden Firebase için Cloud Functions'ı seçin.
- İşlevler listesinde adına tıklayarak bir işlev 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'ya tıklayın ve Zaman Aşımı metin kutusuna bir saniye girin.
- İşlevi güncellemek için Kaydet'e tıklayın.
CPU varsayılanlarını geçersiz kıl
2 GB'a kadar ayrılan bellek, Cloud Functions for Firebase'deki (2. nesil) her işlev varsayılan olarak bir CPU'dur ve ardından 4 ve 8 GB için 2 CPU'ya çıkar. Bunun, aşağıdaki tabloda ifade edildiği gibi düşük bellekli işlevler için biraz daha yüksek maliyetlere yol açabilecek şekillerde 1. nesil varsayılan davranıştan önemli ölçüde farklı olduğuna dikkat edin:
tahsis edilen RAM | Sürüm 1 varsayılan CPU (kesirli) | Sürüm 2 varsayılan CPU | ms başına fiyat artışı |
---|---|---|---|
128MB | 1/12 | 1 | 10.5x |
256MB | 1/6 | 1 | 5.3x |
512MB | 1/3 | 1 | 2,7x |
1 GB | 7/12 | 1 | 1,6x |
2 GB | 1 | 1 | 1x |
4 cigabayt | 2 | 2 | 1x |
8GB | 2 | 2 | 1x |
16 GB | yok | 4 | yok |
2. nesil işlevleriniz için 1. nesil davranışını korumayı tercih ederseniz, 1. nesil varsayılanları global bir seçenek olarak ayarlayın:
// Turn off Firebase defaults
setGlobalOptions({ cpu: 'gcfv1' });
CPU yoğun işlevler için 2. nesil, ek CPU'yu yapılandırma esnekliği sağlar. CPU'yu aşağıda gösterildiği gibi işlev bazında artırabilirsiniz:
// Boost CPU in a function:
export const analyzeImage = onObjectFinalized({ cpu: 2 }, (event) => {
// computer vision goes here
});