1. Giriş
Cloud Run işlevleri yazmaya başlamak için aşağıdaki kod laboratuvarlarını kullanabilirsiniz:
- HTTP Cloud Run işlevlerini kullanmaya başlama
- Etkinlik odaklı Cloud Run işlevlerini kullanmaya başlama
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
- 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.
- 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.
- 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:
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:
İ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:
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:
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:
İkincisi, sanal makine oluşturulduktan sonra yayınlanır ve şöyle görünür:
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.
- 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:
- 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:
Add Eventarc Trigger
düğmesini tıklayın:
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:
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:
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:
İ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:
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:
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:
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.