İpuçları ve hileler

Bu belgede Bulut İşlevlerinin tasarlanması, uygulanması, test edilmesi ve dağıtılmasına yönelik en iyi uygulamalar açıklanmaktadır.

Doğruluk

Bu bölümde Bulut İşlevlerini tasarlamaya ve uygulamaya yönelik genel en iyi uygulamalar açıklanmaktadır.

İdempotent fonksiyonları yazın

İşlevleriniz birden çok kez çağrılsa bile aynı sonucu vermelidir. Bu, önceki çağrının kodunuzun yarısında başarısız olması durumunda çağrıyı yeniden denemenize olanak tanır. Daha fazla bilgi için bkz . olaya dayalı işlevleri yeniden deneme .

Arka plan etkinliklerini başlatmayın

Arka plan etkinliği, işleviniz sonlandırıldıktan sonra gerçekleşen herhangi bir şeydir. Bir işlev çağrısı, işlev geri döndüğünde veya Node.js olay odaklı işlevlerde callback bağımsız değişkeninin çağrılması gibi başka bir şekilde tamamlanma sinyali verdiğinde sona erer. Düzgün sonlandırmadan sonra çalıştırılan herhangi bir kod CPU'ya erişemez ve herhangi bir ilerleme kaydedemez.

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, beklenmeyen davranışlara ve teşhis edilmesi zor hatalara yol açabilir. Bir işlev sona erdikten sonra ağa erişim genellikle bağlantıların sıfırlanmasına yol açar ( ECONNRESET hata kodu).

Arka plan etkinliği genellikle bireysel çağrıların günlüklerinde, çağrının bittiğini söyleyen satırdan sonra günlüğe kaydedilen herhangi bir şey bulunarak tespit edilebilir. Arka plan etkinliği bazen, özellikle geri aramalar veya zamanlayıcılar gibi eşzamansız işlemler mevcut olduğunda, kodun daha derinlerine gömülebilir. İşlevi sonlandırmadan önce tüm eşzamansız işlemlerin tamamlandığından emin olmak için kodunuzu gözden geçirin.

Geçici dosyaları her zaman sil

Geçici dizindeki yerel disk depolama alanı, bellek içi bir dosya sistemidir. Yazdığınız dosyalar, işlevinizin kullanabileceği belleği tüketir ve bazen çağrılar arasında varlığını sürdürür. Bu dosyaların açıkça silinmemesi, sonuçta bellek yetersiz hatasına ve ardından soğuk başlatmaya neden olabilir.

Belirli bir işlev tarafından kullanılan belleği, bu işlevi GCP Konsolu'ndaki işlevler listesinde seçip Bellek kullanımı grafiğini seçerek görebilirsiniz.

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

Ardışık düzen kullanarak daha büyük dosyaları işlerken bellek gereksinimlerini azaltabilirsiniz. Örneğin, Cloud Storage'daki bir dosyayı bir okuma akışı oluşturarak, bunu akış tabanlı bir süreçten geçirerek ve çıkış akışını doğrudan Cloud Storage'a yazarak işleyebilirsiniz.

İşlev Çerçevesi

Bir işlevi dağıttığınızda, İşlevler Çerçevesi, geçerli sürümü kullanılarak otomatik olarak bir bağımlılık olarak eklenir. Aynı bağımlılıkların farklı ortamlarda tutarlı bir şekilde kurulduğundan emin olmak için işlevinizi İşlevler Çerçevesinin belirli bir sürümüne sabitlemenizi öneririz.

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

Aletler

Bu bölümde Cloud Functions'ı uygulamak, test etmek ve etkileşimde bulunmak için araçların nasıl kullanılacağına ilişkin yönergeler sağlanmaktadır.

Yerel kalkınma

İşlev dağıtımı biraz zaman alır, bu nedenle işlevinizin kodunu yerel olarak test etmek genellikle daha hızlıdır.

Firebase geliştiricileri Firebase CLI Cloud Functions Emulator'ı kullanabilir.

E-posta göndermek için Sendgrid'i kullanın

Cloud Functions, 25 numaralı bağlantı noktasında giden bağlantılara izin vermediğinden, bir SMTP sunucusuyla güvenli olmayan bağlantılar kuramazsınız. E-posta göndermenin önerilen yolu SendGrid kullanmaktır. E-posta göndermeye ilişkin diğer seçenekleri Google Compute Engine için Bir Örnekten E-posta Gönderme eğitiminde bulabilirsiniz.

Verim

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 bilgisi içermediğinden, yürütme ortamı genellikle sıfırdan başlatılır ( soğuk başlatma olarak bilinen süreçte). Soğuk başlatma meydana geldiğinde işlevin genel bağlamı değerlendirilir.

İşlevleriniz modülleri içe aktarıyorsa bu modüllerin yükleme süresi, soğuk başlatma sırasında çağrı gecikmesine katkıda bulunabilir. Bağımlılıkları doğru şekilde yükleyerek ve işlevinizin kullanmadığı bağımlılıkları yüklemeyerek bu gecikmeyi ve işlevinizi dağıtmak için gereken süreyi azaltabilirsiniz.

Gelecekteki çağrılarda nesneleri yeniden kullanmak için genel değişkenleri kullanın

Bir Bulut İşlevinin durumunun gelecekteki çağrılar için korunacağına dair bir garanti yoktur. Ancak Cloud Functions genellikle önceki bir çağrının yürütme ortamını geri dönüştürür. Global kapsamda bir değişken bildirirseniz değeri, yeniden hesaplanmasına gerek kalmadan sonraki çağrılarda yeniden kullanılabilir.

Bu şekilde, her işlev çağrısında yeniden oluşturulması pahalı olabilecek nesneleri önbelleğe alabilirsiniz. Bu tür nesnelerin işlev gövdesinden genel kapsama taşınması, önemli performans iyileştirmelerine neden olabilir. Aşağıdaki örnek, her işlev örneği için yalnızca bir kez ağır bir nesne oluşturur ve bunu, verilen örneğe ulaşan tüm işlev çağrıları arasında paylaşır:

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 yanıt metnini veya make_response kullanılarak bir Response nesnesine dönüştürülebilecek herhangi bir değer kümesini döndürür.

Ağ bağlantılarını, kitaplık referanslarını ve API istemci nesnelerini genel kapsamda önbelleğe almak özellikle önemlidir. Örnekler için Ağ İletişimini Optimize Etme konusuna bakın.

Küresel değişkenlerin tembel başlatılmasını yapın

Değişkenleri genel kapsamda başlatırsanız, başlatma kodu her zaman soğuk başlatma çağrısı yoluyla yürütülür ve işlevinizin gecikmesi artar. Belirli durumlarda bu, try / catch bloğunda uygun şekilde işlenmezse çağrılan hizmetlerde aralıklı zaman aşımlarına neden olur. Bazı nesneler tüm kod yollarında kullanılmıyorsa, bunları isteğe bağlı olarak yavaş bir şekilde başlatmayı düşünün:

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 tembel olarak başlatılan genel değerleri kullanır. Bir istek nesnesini ( flask.Request ) alır ve yanıt metnini veya make_response kullanılarak bir Response nesnesine dönüştürülebilecek herhangi bir değer kümesini döndürür.

Tek bir dosyada birden fazla işlev tanımlıyorsanız ve farklı işlevler farklı değişkenler kullanıyorsa bu özellikle önemlidir. Tembel başlatmayı kullanmadığınız sürece, başlatılan ancak hiç kullanılmayan değişkenler üzerinde kaynak israfına neden olabilirsiniz.

Minimum örnek sayısını ayarlayarak soğuk başlatmaları azaltın

Varsayılan olarak Cloud Functions, gelen isteklerin sayısına göre örnek sayısını ölçeklendirir. Cloud Functions'ın istekleri sunmaya hazır tutması gereken minimum örnek sayısını ayarlayarak bu varsayılan davranışı değiştirebilirsiniz. Minimum sayıda örnek ayarlamak, uygulamanızın soğuk başlatılmasını azaltır. Uygulamanız gecikmeye duyarlıysa minimum örnek sayısını ayarlamanızı öneririz.

Bu çalışma zamanı seçenekleri hakkında daha fazla bilgi için bkz . Ölçekleme davranışını denetleme .

Ek kaynaklar

"Google Bulut Performans Atlası" videosu Bulut İşlevleri Soğuk Önyükleme Süresi'nde performansı optimize etme hakkında daha fazla bilgi edinin.