İpuçları ve püf noktaları

Bu belgede, Çevik yaklaşımın tasarımı, uygulanması, test edilmesi Cloud Functions'ı dağıtmanızı sağlar.

Doğruluk

Bu bölümde, tasarım ve uygulamaya ilişkin genel en iyi uygulamalar Cloud Functions.

Iempotent fonksiyonlar yazma

Fonksiyonlarınız, birden çok çağrılsa bile aynı sonucu üretmelidir. kez. Bu sayede, önceki çağrı başarısız olursa çağrıyı yeniden deneyebilirsiniz. öğrenmeniz gerekir. Daha fazla bilgi için bkz. etkinliğe dayalı işlevleri yeniden deneyin.

Arka plan etkinlikleri başlatma

Arka plan etkinliği, işleviniz sonlandırıldıktan sonra gerçekleşen her şeydir. İşlev geri döndüğünde veya başka bir şekilde sinyal verdiğinde işlev çağrısı biter Örneğin, Node.js etkinliğe dayalı callback bağımsız değişkenini çağırarak tamamlama işlevlerine dahildir. Kontrollü sonlandırmadan sonra çalıştırılan kodlar CPU'ya erişemez ve herhangi bir ilerleme kaydetmeyecek.

Ayrıca aynı ortamda sonraki bir çağrı yürütüldüğünde arka plan etkinliğiniz devam eder ve yeni çağrıyı engeller. Bu, beklenmedik davranışlara ve teşhis edilmesi zor hatalara neden olabilir. Erişme bir işlev sona erdikten sonra ağ, genellikle bağlantıların sıfırlanmasına yol açar (ECONNRESET hata kodu).

Arka plan etkinliği genellikle bağımsız çağrılarla günlüklerde algılanabilir. şunu söyleyen satırdan sonra günlüğe kaydedilen herhangi bir şeyi bularak tamamlandı. Arka plan etkinliği bazen kodun daha derinlerine gömülebilir. özellikle de geri çağırma veya zamanlayıcı gibi eşzamansız işlemler bulunduğunda. Kopyalamadan önce tüm eşzamansız işlemlerin tamamlandığından emin olmak için kodunuzu inceleyin. fonksiyonu sonlandırın.

Geçici dosyaları her zaman sil

Geçici dizindeki yerel disk depolama alanı, bellek içi dosya sistemidir. Dosyalar depoladığınız yerler, işlevinizin kullanabileceği belleği tüketir ve bazen çağrılır. Bu dosyaların açıkça silinmemesi, bellek dolması hatasına ve bunun sonucunda baştan başlatmaya yol açabilir.

Tek bir işlev tarafından kullanılan belleği işlev listesini GCP Console'a gidip Bellek kullanımı grafiğini seçin.

Geçici dizinin dışına yazmaya çalışmayın ve Dosya yolları oluşturmak için platformdan/işletim sisteminden bağımsız yöntemler.

Ardışık düzen kullanarak daha büyük dosyaları işlerken bellek gereksinimlerini azaltabilirsiniz. Örneğin, okuma akışı oluşturarak Cloud Storage'da bir dosyayı işleyebilir. akış tabanlı bir süreçten geçirme ve çıkış akışı yazma doğrudan Cloud Storage'a aktarabilir.

Functions Framework

Bir işlev dağıttığınızda, Functions Çerçevesi otomatik olarak bağımlılığından bahsedeceğiz. Aynı bağımlılıkların farklı ortamlarda tutarlı olarak yüklü olduğundan, işlevinizi Functions Çerçevesi'nin belirli bir sürümüne sabitlediğinizden emin olun.

Bunu yapmak için, tercih ettiğiniz sürümü ilgili kilit dosyasına ekleyin (örneğin, Node.js için package-lock.json veya Python için requirements.txt).

Araçlar

Bu bölümde uygulama, test ve kontrol araçlarının nasıl kullanılacağı Cloud Functions ile etkileşime geçin.

Yerel geliştirme

İşlev dağıtımı biraz zaman aldığından kodu test etmek genellikle daha hızlıdır yerel olarak ayarlayabilirsiniz.

Firebase geliştiricileri, Firebase CLI Cloud Functions Emülatörü.

E-posta göndermek için Sendgrid'i kullanma

Cloud Functions, bağlantı noktası 25 üzerinde giden bağlantılara izin vermediğinden şunları yapamazsınız: SMTP sunucusuna güvenli olmayan bağlantılar kurma. İletinizi göndermek için önerilen yöntem SendGrid'i kullanmaktır. Diğer seçenekleri e-posta gönderdiğiniz için Örnekten E-posta Gönderme Google Compute Engine eğiticisi.

Performans

Bu bölümde, performansı optimize etmeye yönelik en iyi uygulamalar açıklanmaktadır.

Bağımlılıkları akıllıca kullanın

İşlevler durum bilgisiz olduğundan yürütme ortamı genellikle başlatılır. en baştan (baştan başlatma olarak bilinen süreçte). Soğuk başlatma gerçekleştiğinde fonksiyonun genel bağlamı değerlendirilir.

Fonksiyonlarınız modülleri içe aktarıyorsa, bu modüllerin yükleme süresi baştan başlatma sırasında çağrı gecikmesi. Bu gecikmeyi kendiniz de bağımlılıkları doğru yükleyerek ve oluşturarak işlevinizi dağıtmak için kullanmadığı bağımlılıkları yüklemez.

Gelecekteki çağrılarda nesneleri yeniden kullanmak için global değişkenler kullanma

Cloud Functions işlevinin durumunun çağrılır. Ancak Cloud Functions, yürütme sürecini genellikle geri dönüştürür. ortamına ekleyebilirsiniz. Global kapsamda bir değişken bildirirseniz gerek kalmadan sonraki çağrılarda yeniden kullanılabilir. yeniden hesaplandı.

Bu şekilde, her bir sistemde yeniden oluşturulması pahalı olabilecek nesneleri işlev çağrısı. Bu tür nesneleri işlev gövdesinden global kapsama taşıma önemli performans artışları sağlayabilir. Aşağıdaki örnek her işlev örneği için yalnızca bir kez ağır bir nesne oluşturur ve bunu tüm belirtilen örneğe ulaşan işlev çağrıları:

Node.js

console.log('Global scope');
const perInstance = heavyComputation();
const functions = require('firebase-functions');

exports.function = functions.https.onRequest((req, res) => {
  console.log('Function invocation');
  const perFunction = lightweightComputation();

  res.send(`Per instance: ${perInstance}, per function: ${perFunction}`);
});

Python

import time

from firebase_functions import https_fn

# Placeholder
def heavy_computation():
  return time.time()

# Placeholder
def light_computation():
  return time.time()

# Global (instance-wide) scope
# This computation runs at instance cold-start
instance_var = heavy_computation()

@https_fn.on_request()
def scope_demo(request):

  # Per-function scope
  # This computation runs every time this function is called
  function_var = light_computation()
  return https_fn.Response(f"Instance: {instance_var}; function: {function_var}")
  

Bu HTTP işlevi, bir istek nesnesini (flask.Request) alır ve veya yanıt metnine dönüştürülebilecek herhangi bir değer kümesi Response nesne kullanılıyor make_response.

Özellikle ağ bağlantılarını, kitaplık referanslarını, ve API istemci nesnelerini kapsar. Örnekler için Ağ İletişimini Optimize Etme bölümüne bakın.

Genel değişkenlerin geç ilk kullanıma hazırlanması

Global kapsamdaki değişkenleri başlatırsanız başlatma kodu her zaman işlevinizin gecikmesini artırarak baştan başlatma çağrısı ile yürütülür. Bazı durumlarda bu, çağrılan hizmetlerin zaman aşımına uğramasına neden olur. try/catch blokunda uygun şekilde işlenmezse. Eğer bazı nesneler tüm kod yollarında kullanılmıyor. Bunları geç başlatmanızı öneririz isteğe bağlı:

Node.js

const functions = require('firebase-functions');
let myCostlyVariable;

exports.function = functions.https.onRequest((req, res) => {
  doUsualWork();
  if(unlikelyCondition()){
      myCostlyVariable = myCostlyVariable || buildCostlyVariable();
  }
  res.status(200).send('OK');
});

Python

from firebase_functions import https_fn

# Always initialized (at cold-start)
non_lazy_global = file_wide_computation()

# Declared at cold-start, but only initialized if/when the function executes
lazy_global = None

@https_fn.on_request()
def lazy_globals(request):

  global lazy_global, non_lazy_global

  # This value is initialized only if (and when) the function is called
  if not lazy_global:
      lazy_global = function_specific_computation()

  return https_fn.Response(f"Lazy: {lazy_global}, non-lazy: {non_lazy_global}.")
  

Bu HTTP işlevi, geç başlatılan genel değerleri kullanır. Bir istek nesnesini alır (flask.Request) gibi bir komut alır ve yanıt metnini ya da dönüştürülebilir ve Response nesnesine dönüştürülebilir. make_response.

Bu, özellikle tek bir dosyada birden fazla işlev tanımlarsanız ve farklı işlevler farklı değişkenler kullanır. Tembel kullanmadıkça yoksa ilk kullanıma hazır hale getirilmiş değişkenler için de kaynak israf edebilirsiniz hiç kullanılmadı.

Minimum örnek sayısı ayarlayarak baştan başlatma sayısını azaltın

Varsayılan olarak, Cloud Functions örnek sayısını gelen istek sayısıdır. Bu varsayılan davranışı bir Cloud Functions'ın hazır tutulması gereken minimum örnek sayısı sunma isteklerini kabul eder. Minimum örnek sayısı ayarlamak, baştan başlatma sayısını azaltır en iyi yoludur. Aşağıdaki durumlarda minimum örnek sayısı belirlemenizi öneririz: uygulaması gecikmeye duyarlıdır.

Görüntüleyin Ölçeklendirme davranışını kontrol etme bu çalışma zamanı seçenekleri hakkında daha fazla bilgi edinin.

Ek kaynaklar

"Google Cloud Performansı" bölümünde performansı optimize etme hakkında daha fazla bilgi Atlas" görüntülü Cloud Functions Soğuk Başlatma Süresi.