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
- Olay denetimli 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 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 tarafından 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'da 16 GB'a kadar RAM ve 4 vCPU'dan yararlanarak daha büyük bellek içi, yoğun hesaplama gerektiren ve daha paralel iş yükleri çalıştırın.
- Eşzamanlılık: Tek bir işlev örneğiyle 1.000'e kadar eşzamanlı istek işleyin. Böylece, baştan başlatma işlemlerini en aza indirebilir ve ölçeklendirme sırasında gecikmeyi azaltabilirsiniz.
- Minimum örnekler: Sıfırdan başlatma işlemlerinizi azaltmak 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 payload 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.
- Trafik iki revizyon arasında nasıl bölünür?
- Minimum sayıda örnekle baştan başlatma sorunundan kurtulma.
- Eşzamanlılığı ayarlama.
2. Kurulum ve Gereksinimler
Kendine ait tempoda ortam kurulumu
- Google Cloud Console'da oturum açın ve 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 (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dize otomatik olarak oluşturur. Bu dizenin ne olduğu genellikle önemli değildir. Çoğu kod laboratuvarında proje kimliğine (genellikle
PROJECT_ID
olarak tanımlanır) referans vermeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele başka bir kimlik oluşturabilirsiniz. Alternatif olarak, kendi anahtarınızı deneyerek kullanılabilir olup olmadığını görebilirsiniz. Bu adımdan sonra değiştirilemez ve proje boyunca geçerli kalır. - Bazı API'lerin kullandığı üçüncü bir değer (Proje Numarası) olduğunu belirtmek isteriz. 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:
Bu sanal makinede ihtiyacınız olan tüm geliştirme araçları yüklüdür. 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örürsünüz.
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ı yalnızca günlüğe kaydeden 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
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ğıtım
Ö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
Bir sonraki işlev için, 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 şu şekilde görünür:
İ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 için 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 Audit Logs 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ı, denetleme günlüğünü bir CloudEvent içine sarmalayan 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
hakkında daha fazla bilgi edinmek için bu konuyu kendiniz inceleyebilirsiniz.
Dağıtım
İş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ı fark edin:
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 ekleyebilirsiniz.
Öncelikle Cloud Functions bölümüne gidin ve 2. nesil ortamla 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çip Save Trigger
simgesini tıklayın:
Son olarak, bir sonraki sayfada index.js
ve package.json
dosyalarını GitHub'daki index.js
ve package.json
dosyalarıyla güncelleyebilir ve Deploy
düğmesini tıklayabilirsiniz:
Test
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 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ğıtım
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 tetikleyiciyi (yukarıdaki dağıtım komutunun URI çıkışı) görüntüleyerek işlevi test ederseniz turuncu arka planlı Hello World
simgesini 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:
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
Ardından, trafiği bu iki düzeltme arasında aşağıdaki gibi bölün (X-XXX
değerini 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, sıfırdan başlatma sayısını sınırlandırmak için yararlıdır.
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, sıfırdan başlatma sorununu ortadan kaldırmak için işlevi minimum örnek değeri 1 olarak ayarlanmış şekilde dağıtırsı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şlevi de vardır:
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 aramalar hemen geri 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 gecikme görmezsiniz. Minimum örnekler sayesinde ilk çağrı için soğuk başlatma sorunu (uzun bir süre 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ımdaki yavaş başlatma özelliğine sahip 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 bir karşılaştırma aracı kullanın. hey
, Cloud Shell'de zaten 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 tarafından en az 100 istek işlenebilir:
gcloud run services update slow-concurrent-function \ --concurrency 100 \ --cpu 1 \ --region $REGION
Eşzamanlı 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] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
Artan eşzamanlılık sayesinde tek bir işlev örneği tüm istekleri işleyebildi ve soğuk 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.
- Trafik iki revizyon arasında nasıl bölünür?
- Minimum sayıda örnekle baştan başlatma sorunundan kurtulma.
- Eşzamanlılığı ayarlama.