Cloud Functions'ı (2. nesil) kullanmaya başlama

1. Giriş

Cloud Run işlevleri yazmaya başlamak için aşağıdaki kod laboratuvarlarını kullanabilirsiniz:

Aksi takdirde, bu kod laboratuvarında Cloud Functions'ı (2. nesil) nasıl oluşturacağınız adım adım açıklanmaktadır.

Genel Bakış

Cloud Functions (2. nesil), Google Cloud'un Hizmet Olarak İşlev teklifi olan Google Cloud Functions'in sonraki sürümüdür. Gelişmiş bir özellik grubuna sahip olan bu yeni sürüm, artık Cloud Run ve Eventarc tarafından desteklenmektedir. Bu sayede performans ve ölçeklenebilirlik üzerinde daha gelişmiş bir kontrol sahibi olursunuz. Ayrıca 90'dan fazla etkinlik kaynağından gelen işlev çalışma zamanı ve tetikleyiciler üzerinde daha fazla kontrol sahibi olursunuz.

Bu kod laboratuvarında, HTTP çağrılarına yanıt veren ve Pub/Sub mesajları ile Cloud Denetleme Günlükleri tarafından tetiklenen Cloud Functions oluşturma konusunda size yol gösterilecektir.

Yenilikler

Cloud Functions'ın bu yeni sürümü; Cloud Run, Cloud Build, Artifact Registry ve Eventarc'tan desteklenen gelişmiş bir FaaS deneyimi sunar.

Gelişmiş Altyapı

  • Daha uzun istek işleme: Cloud Functions'inizi varsayılan 5 dakikadan daha uzun süre çalıştırın. Böylece, Cloud Storage veya BigQuery'deki büyük veri akışlarını işleme gibi daha uzun istek iş yüklerini çalıştırmak daha kolay olur. HTTP işlevleri için bu süre 60 dakikaya kadardır. Etkinlik odaklı işlevler için bu süre şu anda en fazla 10 dakikadır.
  • Daha büyük örnekler: Cloud Functions'ta 16 GB'a kadar RAM ve 4 vCPU sayesinde daha büyük bellek içi, işlem açısından yoğun ve daha fazla paralel iş yükünden yararlanın.
  • Eşzamanlılık: Tek bir işlev örneğiyle 1.000'e kadar eşzamanlı istek işleyebilir, baştan başlatma işlemlerini en aza indirebilir ve ölçeklendirme sırasında gecikmeyi iyileştirebilirsiniz.
  • Minimum örnek sayısı: Baştan başlatma sayısını kesmek için önceden ısıtılmış örnekler sağlayın ve uygulamanızın önyükleme süresinin uygulama performansını etkilemediğinden emin olun.
  • Trafiği bölme: İşlevlerinizin birden fazla sürümünü destekleyin, trafiği farklı sürümler arasında bölün ve işlevinizi önceki bir sürüme geri alın.

Daha geniş etkinlik kapsamı ve CloudEvents desteği

  • Eventarc Entegrasyonu: Cloud Functions artık Cloud Denetleme Günlükleri'ni (BigQuery, Cloud SQL, Cloud Storage...) kullanarak 90'dan fazla etkinlik kaynağı sunan Eventarc için yerel destek içeriyor. Cloud Functions, doğrudan Cloud Pub/Sub'a yayınlayarak özel kaynaklardan gelen etkinlikleri de desteklemeye devam ediyor.
  • CloudEvent biçimi: Tüm etkinlik odaklı işlevler, tutarlı bir geliştirici deneyimi sağlamak için kaynaktan bağımsız olarak endüstri standardı CloudEvents'e ( cloudevents.io) uyar. Yük verileri, cloudevent.data yük verisi içeren yapılandırılmış bir CloudEvent aracılığıyla gönderilir ve CloudEvent standardını uygular.

Neler öğreneceksiniz?

  • Cloud Functions'a (2. nesil) genel bakış.
  • HTTP çağrılarına yanıt veren bir işlev yazma
  • Pub/Sub mesajlarına yanıt veren bir işlev yazma
  • Cloud Storage etkinliklerine yanıt veren bir işlev yazma.
  • Cloud Denetleme Günlükleri'ne yanıt veren bir işlev yazma.
  • Trafiğin iki düzeltme arasında nasıl bölüneceği.
  • Minimum sayıda örnekle baştan başlatma sorunundan kurtulma.
  • Eşzamanlılığı ayarlama.

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcılarının görünen adıdır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman bunu güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersiz olmalıdır ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. Genellikle bu dizenin ne olduğu sizin sorumluluğunuzdadır. Çoğu codelab'de proje kimliğine (genellikle PROJECT_ID olarak tanımlanır) bakmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele dize oluşturabilirsiniz. Alternatif olarak, siz de deneyin ve kullanılıp kullanılamadığına bakın. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz için bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu üç değer hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmak çok pahalı olmayacaktır. Bu eğitimden sonra faturalandırılmamak için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projenin tamamını silebilirsiniz. Google Cloud'un yeni kullanıcıları 300 ABD doları değerindeki ücretsiz deneme programına uygundur.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir olsa da bu kod laboratuvarında bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.

Google Cloud Console'da, sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:

55efc1aaa7a4d3ad.png

Ortam sağlanıp bağlantı kurulabilmesi için birkaç saniye beklemeniz gerekir. İşlem tamamlandığında aşağıdakine benzer bir ekran görürsünüz:

7ffe5cbb04455448.png

İhtiyacınız olan tüm geliştirme araçlarını bu sanal makinede bulabilirsiniz. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz. Hiçbir şey yüklemeniz gerekmez.

gcloud'u ayarlama

Cloud Shell'de, proje kimliğinizin ayarlandığından ve bir PROJECT_ID değişkenine kaydedildiğinden ve REGION değerinin us-west1 olarak ayarlandığından emin olun:

gcloud config set project [YOUR-PROJECT-ID]
PROJECT_ID=$(gcloud config get-value project)
REGION=us-west1

API'leri etkinleştir

Gerekli tüm hizmetleri etkinleştirin:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudfunctions.googleapis.com \
  cloudbuild.googleapis.com \
  eventarc.googleapis.com \
  run.googleapis.com \
  logging.googleapis.com \
  pubsub.googleapis.com

3. HTTP İşlevi

İlk işlev için HTTP isteklerine yanıt veren kimliği doğrulanmış bir Node.js işlevi oluşturalım. Bir işlevin HTTP isteklerine yanıt vermek için nasıl daha fazla zamana sahip olabileceğini göstermek amacıyla 10 dakikalık bir zaman aşımı da kullanalım.

Oluştur

Uygulama için bir klasör oluşturun ve klasöre gidin:

mkdir ~/hello-http && cd $_

Yalnızca HTTP isteklerine yanıt veren bir index.js dosyası oluşturun:

const functions = require('@google-cloud/functions-framework');

functions.http('helloWorld', (req, res) => {
  res.status(200).send('HTTP with Node.js in GCF 2nd gen!');
});

Bağımlılıkları belirtmek için bir package.json dosyası oluşturun:

{
  "name": "nodejs-functions-gen2-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

Dağıtım

İşlevi dağıtın:

gcloud functions deploy nodejs-http-function \
  --gen2 \
  --runtime nodejs16 \
  --entry-point helloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --timeout 600s

Bu adım için kesinlikle gerekli olmasa da 600 saniyelik zaman aşımına dikkat edin. Bu sayede işlev, HTTP isteklerine yanıt vermek için daha uzun bir zaman aşımı süresine sahip olur.

İşlev dağıtıldıktan sonra Cloud Console'un Cloud Functions bölümünde görebilirsiniz:

7541800e1e3f299f.png

Test

İşlevi aşağıdaki komutla test edin:

gcloud functions call nodejs-http-function \
  --gen2 --region $REGION

Yanıt olarak HTTP with Node.js in GCF 2nd gen! mesajını göreceksiniz.

4. Pub/Sub işlevi

İkinci işlev için belirli bir konuya yayınlanan bir Pub/Sub mesajı tarafından tetiklenen bir Python işlevi oluşturalım.

Pub/Sub kimlik doğrulama jetonlarını ayarlama

Pub/Sub hizmet hesabını 8 Nisan 2021'de veya öncesinde etkinleştirdiyseniz Pub/Sub hizmet hesabına iam.serviceAccountTokenCreator rolünü verin:

PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)')

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member  serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role roles/iam.serviceAccountTokenCreator

Oluştur

Sana Özel örneğinde kullanılacak bir Pub/Sub konusu oluşturun:

TOPIC=cloud-functions-gen2-topic
gcloud pubsub topics create $TOPIC

Uygulama için bir klasör oluşturun ve klasöre gidin:

mkdir ~/hello-pubsub && cd $_

CloudEvent kimliğini içeren bir mesajı günlük kaydına ekleyen bir main.py dosyası oluşturun:

import functions_framework

@functions_framework.cloud_event
def hello_pubsub(cloud_event):
   print('Pub/Sub with Python in GCF 2nd gen! Id: ' + cloud_event['id'])

Bağımlılıkları belirtmek için aşağıdaki içeriği içeren bir requirements.txt dosyası oluşturun:

functions-framework==3.*

Dağıtım

İşlevi dağıtın:

gcloud functions deploy python-pubsub-function \
  --gen2 \
  --runtime python39 \
  --entry-point hello_pubsub \
  --source . \
  --region $REGION \
  --trigger-topic $TOPIC

İşlev dağıtıldıktan sonra Cloud Console'un Cloud Functions bölümünde görebilirsiniz:

107029714c32baff.png

Test etme

Konuya mesaj göndererek işlevi test edin:

gcloud pubsub topics publish $TOPIC --message="Hello World"

Alınan CloudEvent'i günlüklerde görürsünüz:

gcloud functions logs read python-pubsub-function \
  --region $REGION --gen2 --format "value(log)"

5. Cloud Storage İşlevi

Bir sonraki işlev için Cloud Storage paketindeki etkinliklere yanıt veren bir Node.js işlevi oluşturalım.

Kur

Cloud Storage işlevlerini kullanmak için Cloud Storage hizmet hesabına pubsub.publisher IAM rolünü verin:

SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT \
  --role roles/pubsub.publisher

Oluştur

Uygulama için bir klasör oluşturun ve klasöre gidin:

mkdir ~/hello-storage && cd $_

Yalnızca Cloud Storage etkinliklerine yanıt veren bir index.js dosyası oluşturun:

const functions = require('@google-cloud/functions-framework');

functions.cloudEvent('helloStorage', (cloudevent) => {
  console.log('Cloud Storage event with Node.js in GCF 2nd gen!');
  console.log(cloudevent);
});

Bağımlılıkları belirtmek için bir package.json dosyası oluşturun:

{
  "name": "nodejs-functions-gen2-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

Dağıtma

Öncelikle bir Cloud Storage paketi oluşturun (veya mevcut bir paketi kullanın):

​​export BUCKET="gs://gcf-gen2-storage-$PROJECT_ID"
gsutil mb -l $REGION $BUCKET

İşlevi dağıtın:

gcloud functions deploy nodejs-storage-function \
  --gen2 \
  --runtime nodejs16 \
  --entry-point helloStorage \
  --source . \
  --region $REGION \
  --trigger-bucket $BUCKET \
  --trigger-location $REGION

İşlev dağıtıldıktan sonra Cloud Console'un Cloud Functions bölümünde görebilirsiniz.

Test

Pakete dosya yükleyerek işlevi test edin:

echo "Hello World" > random.txt
gsutil cp random.txt $BUCKET/random.txt

Alınan CloudEvent'i günlüklerde görürsünüz:

gcloud functions logs read nodejs-storage-function \
  --region $REGION --gen2 --limit=100 --format "value(log)"

6. Cloud Denetleme Günlükleri İşlevi

Sonraki işlev için, bir Compute Engine sanal makine örneği oluşturulduğunda Cloud Denetleme Günlüğü etkinliği alan bir Node.js işlevi oluşturalım. Buna karşılık, yeni oluşturulan sanal makineye, sanal makinenin oluşturucusunu belirten bir etiket ekler.

Yeni oluşturulan Compute Engine sanal makinelerini belirleme

Compute Engine, bir sanal makine oluşturulduğunda 2 denetim günlüğü yayınlar.

İlki, sanal makine oluşturma işleminin başında yayınlanır ve şuna benzer:

8d394a481644c4b6.png

İkincisi, sanal makine oluşturulduktan sonra yayınlanır ve şöyle görünür:

ee0e221d82887cd1.png

first: true ve last: true değerlerinin bulunduğu işlem alanına dikkat edin. İkinci denetim günlüğü, bir örneği etiketlemek için ihtiyaç duyduğumuz tüm bilgileri içerir. Bu nedenle, Cloud Functions'da last: true işaretini kullanarak örneği algılarız.

Kur

Cloud denetleme günlüğü işlevlerini kullanmak istiyorsanız Eventarc için denetleme günlüklerini etkinleştirmeniz gerekir. Ayrıca eventarc.eventReceiver rolüne sahip bir hizmet hesabı kullanmanız gerekir.

  1. Compute Engine API için Cloud Denetleme Günlükleri Yönetici Okuma, Veri Okuma ve Veri Yazma günlük türlerini etkinleştirin:

76b7417ea4071241.png

  1. Varsayılan Compute Engine hizmet hesabına eventarc.eventReceiver IAM rolünü verin:
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
  --role roles/eventarc.eventReceiver

Kodu alın

Uygulamayı içeren depoyu klonlayın:

git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git

Uygulama dizinine gidin:

cd eventarc-samples/gce-vm-labeler/gcf/nodejs

index.js dosyası, bir CloudEvent'e sarmalanmış denetleme günlüğünü alan uygulama kodunu içerir. Ardından, Compute Engine sanal makine örneği ayrıntılarını ayıklayıp sanal makine örneğine bir etiket ayarlar. index.js özelliğini kendi başınıza daha ayrıntılı olarak inceleyebilirsiniz.

Dağıtma

İşlevi, daha önce olduğu gibi gcloud ile dağıtabilirsiniz. İşlevin, --trigger-event-filters işaretiyle Compute Engine eklemeleri için denetleme günlüklerinde nasıl filtreleme yaptığını görebilirsiniz:

gcloud functions deploy gce-vm-labeler \
  --gen2 \
  --runtime nodejs16 \
  --entry-point labelVmCreation \
  --source . \
  --region $REGION \
  --trigger-event-filters="type=google.cloud.audit.log.v1.written,serviceName=compute.googleapis.com,methodName=beta.compute.instances.insert" \
  --trigger-location us-central1

İşlevi dağıtabilir ve Google Cloud Console'dan Eventarc tetikleyicisi de ekleyebilirsiniz.

Öncelikle Cloud Functions bölümüne gidin ve 2. nesil ortam içeren bir işlev oluşturun:

8ba79a12ee152d8.png

Add Eventarc Trigger düğmesini tıklayın:

655346320a5e3631.png

Bu işlem, sağ tarafta Eventarc tetikleyicisi için farklı etkinlik sağlayıcıları ve etkinlikleri seçebileceğiniz bir yan panel açar.

Doğru etkinlik sağlayıcıyı ve etkinliği seçin, ardından Save Trigger simgesini tıklayın:

7d24325ff06c9b05.png

Son olarak, sonraki sayfada index.js ve package.json dosyalarını GitHub'da index.js ve package.json dosyalarıyla güncelleyip Deploy düğmesini tıklayabilirsiniz:

f2e338eed2ccf5a2.png

Test etme

Denetim günlüğü işlevinizi test etmek için Cloud Console'da bir Compute Engine sanal makinesi oluşturmanız gerekir (gcloud ile de sanal makine oluşturabilirsiniz ancak bu yöntem denetim günlüğü oluşturmaz).

Cloud Console'un Compute Engine > Sanal makine örnekleri bölümüne gidip yeni bir sanal makine oluşturun. Sanal makine oluşturma işlemi tamamlandıktan sonra, Cloud Console'daki Temel bilgiler bölümünde veya aşağıdaki komutu kullanarak sanal makinede eklenen creator etiketini görürsünüz:

gcloud compute instances describe YOUR_VM_NAME

Çıktıda etiketi aşağıdaki örnekteki gibi görürsünüz:

...
labelFingerprint: ULU6pAy2C7s=
labels:
  creator: atameldev
...

7. Trafiği bölme

Cloud Functions (2. nesil), işlevlerinizin birden fazla revizyonunu destekler, trafiği farklı revizyonlar arasında böler ve işlevinizi önceki bir sürüme geri alır. Bu, 2. nesil işlevler temelde Cloud Run hizmetleri olduğu için mümkündür.

Bu adımda, bir işlevin 2 düzeltmesini dağıtacak ve ardından trafiği 50-50 olarak böleceksiniz.

Oluştur

Uygulama için bir klasör oluşturun ve bu klasöre gidin:

mkdir ~/traffic-splitting && cd $_

Bir renk ortam değişkenini okuyan ve bu arka plan renginde Hello World ile yanıt veren bir Python işlevi içeren bir main.py dosyası oluşturun:

import os

color = os.environ.get('COLOR')

def hello_world(request):
    return f'<body style="background-color:{color}"><h1>Hello World!</h1></body>'

Dağıtma

Fonksiyonun ilk düzeltmesini turuncu arka planla dağıtın:

COLOR=orange
gcloud functions deploy hello-world-colored \
  --gen2 \
  --runtime python39 \
  --entry-point hello_world \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --update-env-vars COLOR=$COLOR

Bu noktada, tarayıcınızda HTTP tetikleyicisini (yukarıdaki dağıtım komutunun URI çıkışı) görüntüleyerek işlevi test ederseniz, turuncu arka planlı Hello World öğesini görürsünüz:

36ca0c5f39cc89cf.png

İkinci düzeltmeyi sarı arka planla dağıtın:

COLOR=yellow
gcloud functions deploy hello-world-colored \
  --gen2 \
  --runtime python39 \
  --entry-point hello_world \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --update-env-vars COLOR=$COLOR

Bu en son düzeltme olduğundan işlevi test ettiğinizde sarı arka planlı Hello World simgesini görürsünüz:

391286a08ad3cdde.png

Trafiğin yarısını ayırın

Turuncu ve sarı düzeltmeler arasında trafik bölmek için temel Cloud Run hizmetlerinin düzeltme kimliklerini bulmanız gerekir. Düzeltme kimliklerini görme komutu şu şekildedir:

gcloud run revisions list --service hello-world-colored \
  --region $REGION --format 'value(REVISION)'

Çıkış şuna benzer şekilde görünecektir:

hello-world-colored-00001-man
hello-world-colored-00002-wok

Şimdi, trafiği bu iki düzeltme arasında aşağıdaki gibi bölün (X-XXX bölümünü düzeltme adlarınıza göre güncelleyin):

gcloud run services update-traffic hello-world-colored \
  --region $REGION \
  --to-revisions hello-world-colored-0000X-XXX=50,hello-world-colored-0000X-XXX=50

Test

İşlevi, herkese açık URL'sini ziyaret ederek test edin. Zamanların yarısında turuncu düzeltmeyi, diğer yarısında ise sarı düzeltmeyi görürsünüz:

36ca0c5f39cc89cf.png 391286a08ad3cdde.png

Daha fazla bilgi için geri alma, kademeli kullanıma sunma ve trafik taşıma başlıklı makaleyi inceleyin.

8. Minimum örnek sayısı

Cloud Functions'da (2. nesil), etkin durumda tutulacak ve istek sunmaya hazır olacak minimum sayıda işlev örneği belirtilebilir. Bu, baştan başlatma sayısının sınırlandırılmasına yardımcı olur.

Bu adımda, yavaş başlatma özelliğine sahip bir işlev dağıtacaksınız. Soğuk başlatma sorununu gözlemleyebilirsiniz. Ardından, baştan başlatmadan kurtulmak için minimum örnek değeri 1'e ayarlanmış şekilde işlevi dağıtacaksınız.

Oluştur

Uygulama için bir klasör oluşturun ve bu klasöre gidin:

mkdir ~/min-instances && cd $_

main.go dosyası oluşturun. Bu Go hizmetinde, uzun bir başlatmayı simüle etmek için 10 saniye boyunca uyuyan bir init işlevi vardır. Ayrıca, HTTP çağrılarına yanıt veren bir HelloWorld işlevine sahiptir:

package p

import (
        "fmt"
        "net/http"
        "time"
)

func init() {
        time.Sleep(10 * time.Second)
}

func HelloWorld(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Slow HTTP Go in GCF 2nd gen!")
}

Dağıtım

İşlevin ilk düzeltmesini, varsayılan minimum örnek değeri sıfır olacak şekilde dağıtın:

gcloud functions deploy slow-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated

İşlevi şu komutla test edin:

gcloud functions call slow-function \
  --gen2 --region $REGION

İlk aramada 10 saniyelik bir gecikme (soğuk başlatma) görürsünüz ve ardından mesajı görürsünüz. Sonraki çağrılar hemen dönmelidir.

Minimum örnek sayısını ayarlama

İlk istekte sıfırdan başlatma sorununu ortadan kaldırmak için işlevi --min-instances bayrağı 1 olarak ayarlanmış şekilde aşağıdaki gibi yeniden dağıtın:

gcloud functions deploy slow-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --min-instances 1

Test

İşlevi tekrar test edin:

gcloud functions call slow-function \
  --gen2 --region $REGION

Artık ilk istekte 10 saniyelik gecikmeyi görmeyeceksiniz. Minimum örnek sayısı sayesinde, ilk çağrıdaki baştan başlatma sorunu (uzun bir süre boyunca kullanılmamasından sonra) ortadan kalktı.

Daha fazla bilgi için minimum sayıda örnek kullanma bölümüne bakın.

9. Eşzamanlılık

Cloud Functions'da (2. nesil), bir işlev örneği varsayılan olarak 1 eşzamanlı isteği işler ancak bir örnek tarafından aynı anda işlenebilecek eşzamanlı istek sayısını belirtebilirsiniz. Her paralel istek için yeni bir işlev örneğinin oluşturulması gerekmediğinden bu, baştan başlatma işlemlerini önlemek için de yararlı olabilir.

Bu adımda, önceki adımda bulunan yavaş başlatmalı işlevi kullanacaksınız. İşleve 10 istek gönderirsiniz ve istekleri işlemek için yeni işlev örnekleri oluşturulması gerektiğinden sıfırdan başlatma sorununu tekrar gözlemlersiniz.

Soğuk başlatma sorununu düzeltmek için 100 eşzamanlılık değerine sahip başka bir işlev dağıtırsınız. 10 istemin artık soğuk başlatma sorununa neden olmadığını ve tek bir işlev örneğinin tüm istekleri işleyebileceğini göreceksiniz.

Eşzamanlılık olmadan test etme

İşlevin URL'sini alın:

SLOW_URL=$(gcloud functions describe slow-function --region $REGION --gen2 --format="value(serviceConfig.uri)")

Yavaş işleve 10 eşzamanlı istek göndermek için hey adlı açık kaynak karşılaştırma aracını kullanın. hey zaten Cloud Shell'de yüklüyse:

hey -n 10 -c 10 $SLOW_URL

hey çıktısında bazı isteklerin uzun sürdüğünü görürsünüz:

Summary:
  Total:        10.9053 secs
  Slowest:      10.9048 secs
  Fastest:      0.4439 secs
  Average:      9.7930 secs
  Requests/sec: 0.9170

  Total data:   310 bytes
  Size/request: 31 bytes

Response time histogram:
  0.444 [1]     |■■■■
  1.490 [0]     |
  2.536 [0]     |
  3.582 [0]     |
  4.628 [0]     |
  5.674 [0]     |
  6.720 [0]     |
  7.767 [0]     |
  8.813 [0]     |
  9.859 [0]     |
  10.905 [9]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Bunun nedeni, istekleri işlemek için daha fazla işlev örneği oluşturulmasıdır. İşlevin etkin örnekleri sayısını kontrol ederseniz bir noktada birden fazla örnek oluşturulduğunu ve bunların soğuk başlatma sorununa neden olduğunu da görürsünüz:

9f5c6877836d62fb.png

Dağıtım

Önceki işlevle aynı yeni bir işlev dağıtın. Dağıtıldıktan sonra eşzamanlılığını artırabilirsiniz:

gcloud functions deploy slow-concurrent-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --min-instances 1

Eşzamanlılığı ayarlama

İşlev için temel Cloud Run hizmetinin eşzamanlılığını 100 olarak ayarlayın (en fazla 1.000 olabilir). Bu sayede tek bir işlev örneği en az 100 isteği işleyebilir:

gcloud run services update slow-concurrent-function \
  --concurrency 100 \
  --cpu 1 \
  --region $REGION 

Eşzamanlılıkla test etme

İşlevin URL'sini alın:

SLOW_CONCURRENT_URL=$(gcloud functions describe slow-concurrent-function --region $REGION --gen2 --format="value(serviceConfig.uri)")

Ardından, 10 eşzamanlı istek göndermek için hey simgesini kullanın:

hey -n 10 -c 10 $SLOW_CONCURRENT_URL

hey işlevinin çıktısında tüm isteklerin hızlı bir şekilde işlendiğini göreceksiniz:

Summary:
  Total:        0.2164 secs
  Slowest:      0.2163 secs
  Fastest:      0.0921 secs
  Average:      0.2033 secs
  Requests/sec: 46.2028

  Total data:   310 bytes
  Size/request: 31 bytes

Response time histogram:
  0.092 [1]     |■■■■
  0.105 [0]     |
  0.117 [0]     |
  0.129 [0]     |
  0.142 [0]     |
  0.154 [0]     |
  0.167 [0]     |
  0.179 [0]     |
  0.191 [0]     |
  0.204 [0]     |
  0.216 [9]     |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Tek bir işlev örneği tüm istekleri işleyebildi ve artan eşzamanlılık sayesinde baştan başlatma sorunu ortadan kalktı.

Daha fazla bilgi için eşzamanlılık konusuna bakın.

10. Tebrikler!

Codelab'i tamamladığınız için tebrikler.

Ele aldığımız konular

  • Cloud Functions'a (2. nesil) genel bakış.
  • HTTP çağrılarına yanıt veren bir işlev yazma
  • Pub/Sub mesajlarına yanıt veren bir işlev yazma
  • Cloud Storage etkinliklerine yanıt veren bir işlev yazma.
  • Cloud Denetleme Günlükleri'ne yanıt veren bir işlev yazma.
  • Trafiğin iki düzeltme arasında nasıl bölüneceği.
  • Minimum sayıda örnekle baştan başlatma sorunundan kurtulma.
  • Eşzamanlılığı ayarlama.