1. Genel Bakış
Sunucusuz Taşıma İstasyonu codelab'leri serisi (kendi kendine ilerleyen, uygulamalı eğiticiler) ve ilgili videolar, Google Cloud sunucusuz geliştiricilerinin uygulamalarını bir veya daha fazla taşıma işleminde yönlendirerek uygulamalarını modernleştirmelerine yardımcı olmayı amaçlar. Bu videolar genellikle eski hizmetlerden uzaklaştırılır. Bu sayede uygulamalarınızı daha taşınabilir hale getirir, daha fazla seçenek ve esneklik elde edebilir, daha geniş bir Cloud ürünü yelpazesiyle entegrasyon ve erişim elde edebilir, ayrıca yeni dil sürümlerine kolayca geçiş yapabilirsiniz. Başlangıçta özellikle App Engine (standart ortam) geliştiricileri olmak üzere ilk Cloud kullanıcılarına odaklanan bu seri, Cloud Functions ve Cloud Run gibi diğer sunucusuz platformları veya uygun olduğu durumlarda diğer sunucusuz platformları ya da diğer platformları kapsayacak kadar geniş kapsamlıdır.
Bu codelab'in amacı, Python 2 App Engine geliştiricilerine App Engine Görev Sırası pull görevlerinden Cloud Pub/Sub'a nasıl geçiş yapılacağını göstermektir. Ayrıca, App Engine NDB'den Cloud NDB'ye Datastore erişimi için dolaylı geçiş (genellikle 2. Modül'de ele alınmıştır) ve Python 3'e yükseltme mevcuttur.
18. Modül'de, pull görevlerinin uygulamanızda kullanımını nasıl ekleyeceğinizi öğreneceksiniz. Bu modülde, tamamlanmış Modül 18 uygulamasını alıp bu kullanımı Cloud Pub/Sub'a taşıyacaksınız. Push görevleri için Görev Sıralarını kullananlar, bunun yerine Cloud Tasks'a geçiş yapacak ve bunun yerine Modül 7-9'a başvurmaları gerekir.
Demoda aşağıdaki işlemleri yapmayı öğreneceksiniz:
- App Engine Görev Sırası (görevleri çekme) kullanımını Cloud Pub/Sub ile değiştirin
- App Engine NDB kullanımını Cloud NDB ile değiştirin (Modül 2'ye de bakın)
- Uygulamayı Python 3'e taşıma
Gerekenler
- Etkin bir GCP faturalandırma hesabına sahip bir Google Cloud Platform projesi
- Temel Python becerileri
- Yaygın Linux komutlarıyla ilgili bilgi
- App Engine uygulamalarını geliştirme ve dağıtma ile ilgili temel bilgiler
- Çalışan bir Modül 18 App Engine örnek uygulaması
Anket
Bu eğiticiden nasıl yararlanacaksınız?
Python deneyiminizi nasıl değerlendirirsiniz?
Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
2. Arka plan
App Engine Görev Sırası, hem push hem de pull görevlerini destekler. Google Cloud, uygulama taşınabilirliğini iyileştirmek için Task Queue gibi eski paket hizmetlerden, Cloud'un bağımsız veya eşdeğer üçüncü taraf hizmetlerine geçiş yapmanızı önerir.
- Görev Sırası aktarma görevi kullanıcıları, Cloud Görevler'e taşınmalıdır.
- Görev Sırası pull görevi kullanıcıları, Cloud Pub/Sub'a geçiş yapmalıdır.
Taşıma Modülleri 7-9, push görevlerinin taşınmasını kapsarken 18-19 arasındaki Modüller pull görevini taşımaya odaklanır. Cloud Tasks, Task Queue push görevleriyle daha yakından eşleşir ancak Pub/Sub, Task Queue pull görevlerine çok yakın değildir.
Pub/Sub, Görev Sırası tarafından sağlanan pull işlevinden daha fazla özelliğe sahiptir. Örneğin, Pub/Sub'ın push işlevi vardır ancak Cloud Tasks, Görev Sırası aktarma görevlerine benzer. Bu nedenle, Pub/Sub push işlemi, Taşıma Modüllerinin hiçbirinin kapsamında değildir. Bu Modül 19 codelab'inde, sıraya ekleme mekanizmasının Görev Sırası çekme sıralarından Pub/Sub'a geçirileceği ve Modül 2 taşıma işleminin tekrarlanarak App Engine NDB'den Datastore erişimi için Cloud NDB'ye taşıma süreci gösterilmektedir.
Modül 18 kodu "reklamı yapıldı" durumundayken Kaynak, Python 2 örnek uygulaması olarak Python 2 ve 3 uyumludur. Buradaki Modül 19'da Cloud Pub/Sub'a (ve Cloud NDB'ye) geçiş yaptıktan sonra bile kaynak bu şekilde kalır.
Bu eğitim aşağıdaki adımları içerir:
- Kurulum/Ön Çalışma
- Yapılandırmayı güncelleyin
- Uygulama kodunu değiştir
3. Kurulum/Ön Çalışma
Bu bölümde aşağıdakilerin nasıl yapılacağı açıklanmaktadır:
- Cloud projenizi oluşturun
- Temel örnek uygulamayı al
- Temel uygulamayı (yeniden) dağıtma ve doğrulama
- Yeni Google Cloud hizmetlerini/API'lerini etkinleştirme
Bu adımlar, çalışan bir kodla başlamanızı ve kodun Cloud hizmetlerine taşınmaya hazır olmasını sağlar.
1. Proje oluşturun
Modül 18 codelab'ini tamamladıysanız aynı projeyi (ve kodu) yeniden kullanın. Alternatif olarak, yeni bir proje oluşturabilir veya mevcut başka bir projeyi yeniden kullanabilirsiniz. Projenin etkin bir faturalandırma hesabı ve etkin bir App Engine uygulamasının bulunduğundan emin olun. Bu codelab'de ihtiyacınız olduğunda proje kimliğinizi bulun ve PROJECT_ID
değişkeniyle her karşılaştığınızda kullanın.
2. Temel örnek uygulamayı al
Ön koşullardan biri, çalışan bir Modül 18 App Engine uygulamasıdır. Bu nedenle codelab'i tamamlayın (önerilendir; yukarıdaki bağlantı) veya kod deposundan Modül 18 kodunu kopyalayın. İster kendi aracınızı ister bizimkiyi kullanın, başlangıç noktamız ("BAŞLAT"). Bu codelab'de, Module 19 depo klasöründeki ("FINISH") koda benzeyen bir kodla sonlandırılır ve taşıma işleminde size yol gösterilir.
- BAŞLAT: Modül 18 klasörü (Python 2)
- SON: Modül 19 klasörü (Python 2 ve 3)
- Deponun tamamı (ZIP dosyasını klonlamak veya indirmek için)
Kullandığınız Modül 18 uygulamasından bağımsız olarak, klasör aşağıdaki gibi görünmelidir. Büyük olasılıkla bir lib
klasörü de vardır:
$ ls README.md appengine_config.py queue.yaml templates app.yaml main.py requirements.txt
3. Temel uygulamayı (yeniden) dağıtma ve doğrulama
Modül 18 uygulamasını dağıtmak için aşağıdaki adımları uygulayın:
- Varsa
lib
klasörünü silin velib
öğesini yeniden doldurmak içinpip install -t lib -r requirements.txt
komutunu çalıştırın. Geliştirme makinenizde hem Python 2 hem de 3 yüklüysepip2
kullanmanız gerekebilir. gcloud
komut satırı aracını yükleyip başlattığınızdan ve kullanımını incelediğinizden emin olun.- (İsteğe bağlı) Verdiğiniz her
gcloud
komutuyla birliktePROJECT_ID
girmek istemiyorsanız Cloud projenizigcloud config set project
PROJECT_ID
olarak ayarlayın. - Örnek uygulamayı
gcloud app deploy
ile dağıtın - Uygulamanın beklendiği gibi ve sorunsuz çalıştığını onaylayın. Modül 18 codelab'ini tamamladıysanız uygulama, en son ziyaretlerle birlikte en çok ziyaret edilen ziyaretçileri de gösterir (aşağıda gösterilmiştir). Aksi takdirde, gösterilecek ziyaretçi sayısı olmayabilir.
Modül 18 örnek uygulamasını taşımadan önce, değiştirilmiş uygulamanın kullanacağı Cloud hizmetlerini etkinleştirmeniz gerekir.
4. Yeni Google Cloud hizmetlerini/API'lerini etkinleştirme
Eski uygulama, ek kurulum gerektirmeyen ancak bağımsız Cloud hizmetleri tarafından sağlanan App Engine paket hizmetlerini kullanıyordu. Güncellenen uygulama, hem Cloud Pub/Sub'ı hem de Cloud Datastore'u (Cloud NDB istemci kitaplığı aracılığıyla) kullanacak. App Engine ve her iki Cloud API'si de "Daima Ücretsiz" seçeneğine sahiptir tier kotaları ve bu sınırların altında kaldığınız sürece bu eğiticiyi tamamlarken ücret ödemezsiniz. Cloud APIs, tercihinize bağlı olarak Cloud Console'dan veya komut satırından etkinleştirilebilir.
Cloud Console'dan
Cloud Console'da API Yöneticisi'nin Kitaplık sayfasına (doğru proje için) gidin ve sayfanın ortasındaki arama çubuğunu kullanarak Cloud Datastore ve Cloud Pub/Sub API'lerini arayın:
Her API için Etkinleştir düğmesini ayrı ayrı tıklayın. Fatura bilgileri istenebilir. Örneğin, Cloud Pub/Sub API Kitaplığı sayfası şu şekildedir:
Komut satırından
Konsoldaki API'leri etkinleştirme konusunda görsel açıdan bilgilendirici olsa da bazıları komut satırını tercih eder. İki API'yi aynı anda etkinleştirmek için gcloud services enable pubsub.googleapis.com datastore.googleapis.com
komutunu çalıştırın:
$ gcloud services enable pubsub.googleapis.com datastore.googleapis.com Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.
Fatura bilgileriniz istenebilir. Diğer Cloud API'lerini etkinleştirmek ve URI'lerinin ne olduğunu öğrenmek isterseniz bunları her API'nin kitaplık sayfasının en altında bulabilirsiniz. Örneğin, "Hizmet adı" olarak pubsub.googleapis.com
tıklayın.
Adımlar tamamlandıktan sonra projeniz API'lere erişebilir. Şimdi sıra, bu API'leri kullanmak için uygulamayı güncellemeye geldi.
4. Pub/Sub kaynakları oluşturma
Modül 18'deki Görev Sırası iş akışının sıra sırasını yeniden sınırlama:
- 18. Modül,
queue.yaml
dosyasını kullanarakpullq
adlı bir pull sırası oluşturdu. - Uygulama, ziyaretçileri izlemek için pull sırasına görevler ekler.
- Görevler sonunda bir çalışan tarafından işlenir ve sınırlı bir süre (bir saat) için kiralanır.
- Son ziyaretçi sayılarını hesaplamak için görevler yürütüldü.
- Görevler tamamlandığında sıradan silinir.
Benzer bir iş akışını Pub/Sub'da çoğaltacaksınız. Sonraki bölümde temel Pub/Sub terminolojisine değinilecek ve gerekli Pub/Sub kaynaklarını oluşturmanın üç farklı yolu açıklanacaktır.
App Engine Görev Sırası (pull) - Cloud Pub/Sub terminolojisi
Pub/Sub'a geçmek için kelime dağarcığınızda küçük düzenlemeler yapmanız gerekir. Aşağıda birincil kategoriler ve her iki üründeki alakalı terimler yer almaktadır. Ayrıca, benzer karşılaştırmaların bulunduğu taşıma rehberini de inceleyin.
- Veri yapısını sıraya ekleme: Task Queue ile, veriler alınma sıralarına gönderilir. veriler konulara aktarılır.
- Sıraya alınmış veri birimleri: Görev Sırası ile pull görevleri, Pub/Sub ile mesajlar olarak adlandırılır.
- Veri işleyenler: Görev Sırası sayesinde çalışanlar, pull görevlerine erişebilir; kullanıyorsanız mesaj almak için aboneliklere/abonelere ihtiyacınız vardır
- Veri ayıklama: Bir pull görevini kiralamak, bir konudan mesaj almak (abonelik aracılığıyla) ile aynıdır.
- Temizleme/tamamlama: İşiniz bittiğinde bir Görev Sırası görevini pull sırasından silmek, Pub/Sub mesajını onaylamaya benzer.
Sıraya eklenen ürün değişse de iş akışı nispeten benzer kalmaya devam ediyor:
- Uygulama, pull sırası yerine
pullq
adlı bir konu kullanır. - Uygulama, pull sırasına görev eklemek yerine bir konuya (
pullq
) mesajlar gönderir. worker
adlı bir abone, görevleri pull sırasından kiralayan bir çalışan yerine, mesajlarıpullq
konusundan alır.- Uygulama, mesaj yüklerini işleyerek Datastore'da ziyaretçi sayısını artırır.
- Uygulama, pull sırasından görevleri silmek yerine işlenen mesajları onaylar.
Görev Sırası ile kurulum, pull sırasının oluşturulmasını içerir. Pub/Sub'da kurulum için hem konu hem de abonelik oluşturmanız gerekir. 18. Modül'de queue.yaml
uygulamasını uygulama yürütme dışında işledik; aynısı Pub/Sub'da da yapılmalı.
Konu ve abonelik oluşturmak için üç seçenek vardır:
- Cloud konsolundan
- Komut satırından veya
- Koddan (kısa Python komut dosyası)
Aşağıdaki seçeneklerden birini belirleyin ve Pub/Sub kaynaklarınızı oluşturmak için ilgili talimatları uygulayın.
Cloud konsolundan
Cloud Console'dan konu oluşturmak için şu adımları uygulayın:
- Cloud Console Pub/Sub Konuları sayfasına gidin.
- En üstteki Konu oluştur'u tıklayın; yeni bir iletişim penceresi açılır (aşağıdaki resme bakın)
- Konu Kimliği alanına
pullq
yazın. - İşaretli tüm seçeneklerin seçimini kaldırın ve Google tarafından yönetilen şifreleme anahtarı'nı seçin.
- Konu oluştur düğmesini tıklayın.
Konu oluşturma iletişim kutusu şu şekilde görünür:
Artık bir konunuz olduğuna göre o konu için abonelik oluşturmanız gerekir:
- Cloud Console Pub/Sub Abonelikleri sayfasına gidin.
- En üstteki Abonelik oluştur'u tıklayın (aşağıdaki resme bakın).
- Abonelik Kimliği alanına
worker
girin. - Cloud Pub/Sub konusu seçin açılır listesinden
pullq
öğesini seçin ve "tam nitelikli yol adını" belirtin. örneğin,projects/PROJECT_ID/topics/pullq
- Yayınlama türü için Çekme'yi seçin.
- Diğer tüm seçenekleri olduğu gibi bırakın ve Oluştur düğmesini tıklayın.
Abonelik oluşturma ekranı şu şekilde görünür:
Ayrıca, Konular sayfasından da abonelik oluşturabilirsiniz. Bu "kısayol" konuları aboneliklerle ilişkilendirmenize yardımcı olabilir. Abonelik oluşturma hakkında daha fazla bilgi edinmek için belgeleri inceleyin.
Komut satırından
Pub/Sub kullanıcıları, sırasıyla gcloud pubsub topics create
TOPIC_ID
ve gcloud pubsub subscriptions create
SUBSCRIPTION_ID
--topic=
TOPIC_ID
komutlarını kullanarak konu ve abonelik oluşturabilir. Bu görevlerin TOPIC_ID
(pullq
) ve SUBSCRIPTION_ID
(worker
) ile yürütüldüğünde PROJECT_ID
projesi için şu çıkış elde edilir:
$ gcloud pubsub topics create pullq Created topic [projects/PROJECT_ID/topics/pullq]. $ gcloud pubsub subscriptions create worker --topic=pullq Created subscription [projects/PROJECT_ID/subscriptions/worker].
Hızlı başlangıç dokümanlarında bu sayfaya da göz atabilirsiniz. Komut satırını kullanmak, konuların ve aboneliklerin düzenli olarak oluşturulduğu iş akışlarını basitleştirebilir ve bu tür komutlar, kabuk komut dosyalarında bu amaçla kullanılabilir.
Koddan (kısa Python komut dosyası)
Konu ve abonelik oluşturmayı otomatikleştirmenin diğer bir yolu da kaynak kodunda Pub/Sub API kullanmaktır. Aşağıda, Modül 19 depo klasöründe maker.py
komut dosyasının kodunu bulabilirsiniz.
from __future__ import print_function
import google.auth
from google.api_core import exceptions
from google.cloud import pubsub
_, PROJECT_ID = google.auth.default()
TOPIC = 'pullq'
SBSCR = 'worker'
ppc_client = pubsub.PublisherClient()
psc_client = pubsub.SubscriberClient()
TOP_PATH = ppc_client.topic_path(PROJECT_ID, TOPIC)
SUB_PATH = psc_client.subscription_path(PROJECT_ID, SBSCR)
def make_top():
try:
top = ppc_client.create_topic(name=TOP_PATH)
print('Created topic %r (%s)' % (TOPIC, top.name))
except exceptions.AlreadyExists:
print('Topic %r already exists at %r' % (TOPIC, TOP_PATH))
def make_sub():
try:
sub = psc_client.create_subscription(name=SUB_PATH, topic=TOP_PATH)
print('Subscription created %r (%s)' % (SBSCR, sub.name))
except exceptions.AlreadyExists:
print('Subscription %r already exists at %r' % (SBSCR, SUB_PATH))
try:
psc_client.close()
except AttributeError: # special Py2 handler for grpcio<1.12.0
pass
make_top()
make_sub()
Bu komut dosyasının çalıştırılması beklenen çıktıyla sonuçlanır (herhangi bir hata olmaması şartıyla):
$ python3 maker.py Created topic 'pullq' (projects/PROJECT_ID/topics/pullq) Subscription created 'worker' (projects/PROJECT_ID/subscriptions/worker)
Mevcut kaynakları oluşturmak için API'nin çağrılması, istemci kitaplığı tarafından atılan ve komut dosyası tarafından incelikle ele alınan google.api_core.exceptions.AlreadyExists
istisnasıyla sonuçlanır:
$ python3 maker.py Topic 'pullq' already exists at 'projects/PROJECT_ID/topics/pullq' Subscription 'worker' already exists at 'projects/PROJECT_ID/subscriptions/worker'
Pub/Sub'da yeniyseniz daha fazla bilgi için Pub/Sub mimarisi teknik belgesini inceleyin.
5. Yapılandırmayı güncelleyin
Yapılandırmadaki güncellemeler, hem çeşitli yapılandırma dosyalarının değiştirilmesini hem de Cloud Pub/Sub ekosisteminde App Engine pull sıralarının eşdeğerini oluşturmayı içerir.
sırası.yaml'yi sil
Görev Sırası'ndan tamamen kaldırılıyor. Pub/Sub bu dosyayı kullanmadığı için queue.yaml
dosyasını silin. Çekme sırası oluşturmak yerine bir Pub/Sub konu (ve abonelik) oluşturursunuz.
requirements.txt
18. Modül'den flask
ürününe katılmak için requirements.txt
alanına hem google-cloud-ndb
hem de google-cloud-pubsub
ekleyin. Güncellenen Modül 19'unuz (requirements.txt
) artık aşağıdaki gibi görünecektir:
flask
google-cloud-ndb
google-cloud-pubsub
Bu requirements.txt
dosyasında sürüm numarası bulunmadığından en son sürümler seçildi. Herhangi bir uyumsuzluk oluşursa, bir uygulamanın çalışan sürümlerini kilitlemek için standart sürüm numaralarını kullanma yöntemini uygulayın.
app.yaml
app.yaml
ile ilgili değişiklikler, Python 2 kullanmaya mı yoksa Python 3'e yükseltme mi yaptığınıza bağlı olarak farklılık gösterir.
Python 2
Yukarıdaki requirements.txt
güncellemesinde Google Cloud istemci kitaplıklarının kullanımına ek olarak yer verilir. Bunun için App Engine'den ek destek, yani birkaç yerleşik kitaplık, setuptools
ve grpcio
gerekir. Yerleşik kitaplıkların kullanımı, app.yaml
içinde bir libraries
bölümü ve kitaplık sürüm numaraları veya "en son" gerektirir hakkındaki makalemizi incelemenizi öneririz. app.yaml
adlı Modül'de aşağıdaki bölümlerden biri henüz yok:
ÖNCE:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
En son sürümlerini seçerek app.yaml
için hem setuptools
hem de grpcio
girişleriyle birlikte bir libraries
bölümü ekleyin. Ayrıca, bu yazının yazıldığı sırada Python 3 için mevcut bir 3.x sürümü (ör. 3.10) ile birlikte yorum yapılan bir yer tutucu runtime
girişi ekleyin. Bu değişikliklerle, app.yaml
artık şu şekilde görünüyor:
SONRA:
#runtime: python310
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
libraries:
- name: setuptools
version: latest
- name: grpcio
version: latest
Python 3
Python 3 kullanıcıları ve app.yaml
için en önemli nokta bir şeyleri kaldırmaktır. Bu bölümde handlers
bölümünü, threadsafe
ve api_version
yönergelerini silip bir libraries
bölümü oluşturmazsınız.
İkinci nesil çalışma zamanları yerleşik üçüncü taraf kitaplıklar sağlamaz. Bu nedenle, app.yaml
içinde libraries
bölümünün bulunması gerekmez. Ayrıca yerleşik olmayan üçüncü taraf paketlerin kopyalanması (bazen tedarikçi firma veya kendi kendine paketleme olarak da bilinir) artık gerekli değildir. Yalnızca uygulamanızın requirements.txt
içinde kullandığı üçüncü taraf kitaplıkları listelemeniz gerekir.
app.yaml
tablosundaki handlers
bölümü, uygulama (komut dosyası) ve statik dosya işleyicilerini belirtmek içindir. Python 3 çalışma zamanı, kendi yönlendirmelerini gerçekleştirmek için web çerçeveleri gerektirdiğinden tüm komut dosyası işleyicileri auto
olarak değiştirilmelidir. Uygulamanız (Modül 18'ler gibi) statik dosyalar sunmuyorsa tüm rotalar auto
olur ve alakasız hale gelir. Sonuç olarak handlers
bölümüne de gerek olmadığından bu bölümü silin.
Son olarak, Python 3'te threadsafe
veya api_version
yönergeleri kullanılmadığı için bunları da silin. Sonuç olarak yalnızca runtime
yönergesinin kalması ve Python 3'ün modern bir sürümünü (örneğin, 3.10) belirtmesi için app.yaml
öğesinin tüm bölümlerini silmeniz gerekir. Bu güncellemelerden önce ve sonra app.yaml
görünümü şu şekilde olacak:
ÖNCE:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
SONRA:
runtime: python310
Python 3 için app.yaml
uygulamasındaki her şeyi silmeye hazır olmayan kullanıcılar için Modül 19 depo klasöründe app3.yaml
alternatif dosyası sağladık. Dağıtımlar için bu dosya adını kullanmak istiyorsanız komutunuzun sonuna şu dosya adını eklediğinizden emin olun: gcloud app deploy app3.yaml
(Aksi takdirde, varsayılan olarak uygulamanızı değiştirmeden bıraktığınız Python 2 app.yaml
dosyasıyla yapacak ve dağıtacaktır).
appengine_config.py
Python 3'e yükseltiyorsanız appengine_config.py
'a gerek yoktur. Bu nedenle Python 3'ü silin. Gerekli değildir, çünkü üçüncü taraf kitaplık desteği yalnızca bunların requirements.txt
içinde belirtilmesini gerektirir. Python 2 kullanıcıları için okumaya devam edin.
appengine_config.py
adlı Modül'de üçüncü taraf kitaplıkları destekleyecek uygun kod bulunur. Örneğin, requirements.txt
ürününe az önce eklenen Flask ve Cloud istemci kitaplıkları:
ÖNCE:
from google.appengine.ext import vendor
# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
Ancak bu kod, yeni eklenen yerleşik kitaplıkları (setuptools
, grpcio
) tek başına desteklemek için yeterli değildir. Birkaç satır daha gerekiyor. appengine_config.py
uygulamasını aşağıdaki gibi güncelleyin:
SONRA:
import pkg_resources
from google.appengine.ext import vendor
# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
# Add libraries to pkg_resources working set to find the distribution.
pkg_resources.working_set.add_entry(PATH)
Cloud istemci kitaplıklarını desteklemek için gereken değişiklikler hakkında daha fazla bilgiyi, paket halinde sunulan hizmetleri taşıma belgelerinde bulabilirsiniz.
Diğer yapılandırma güncellemeleri
lib
klasörünüz varsa bu klasörü silin. Python 2 kullanıcısıysanız aşağıdaki komutu vererek lib
klasörünü yenileyin:
pip install -t lib -r requirements.txt # or pip2
Geliştirme sisteminizde hem Python 2 hem de 3 yüklüyse pip
yerine pip2
kullanmanız gerekebilir.
6. Uygulama kodunu değiştir
Bu bölümde, main.py
ana uygulama dosyasıyla ilgili güncellemeler yer almaktadır. Bu güncellemeler, App Engine Görev Sırası pull sıralarının kullanımını Cloud Pub/Sub ile değiştirmektedir. templates/index.html
adlı web şablonunda değişiklik yapılmamıştır. Her iki uygulama da aynı şekilde çalışmalı ve aynı verileri göstermelidir.
İçe aktarma işlemlerini ve başlatmayı güncelleme
İçe aktarma ve başlatma işlemlerinde birkaç güncelleme vardır:
- İçe aktarma işlemleri için App Engine NDB ve Görev Sırası'nı Cloud NDB ve Pub/Sub ile değiştirin.
QUEUE
olanpullq
adınıTOPIC
olarak değiştirin.- Push görevleri kullanıldığında, çalışan bunları bir saat süreyle kiralar. Ancak Pub/Sub ile zaman aşımları her mesaj için ayrı ayrı ölçülür. Bu nedenle
HOUR
sabit değerini silin. - Cloud API'leri için bir API istemcisi kullanılması gerekir. Bu nedenle, Cloud NDB ve Cloud Pub/Sub için bu istemciyi başlatın. İkincisi ise hem konular hem de abonelikler için istemci sağlar.
- Pub/Sub için Cloud proje kimliği gerekir. Bu nedenle, Cloud proje kimliğini
google.auth.default()
üzerinden içe aktarıp alın. - Pub/Sub için "tam nitelikli yol adları" gerekir Bu nedenle,
*_path()
kolaylık işlevlerini kullanarak bu tür içerikler oluşturun.
Aşağıda Modül 18'den içe aktarma ve başlatma işlemleri, ardından yukarıdaki değişiklikler uygulandıktan sonra bölümlerin nasıl olması gerektiği belirtilmektedir. Yeni kodun çoğu çeşitli Pub/Sub kaynaklarıdır:
ÖNCE:
from flask import Flask, render_template, request
from google.appengine.api import taskqueue
from google.appengine.ext import ndb
HOUR = 3600
LIMIT = 10
TASKS = 1000
QNAME = 'pullq'
QUEUE = taskqueue.Queue(QNAME)
app = Flask(__name__)
SONRA:
from flask import Flask, render_template, request
import google.auth
from google.cloud import ndb, pubsub
LIMIT = 10
TASKS = 1000
TOPIC = 'pullq'
SBSCR = 'worker'
app = Flask(__name__)
ds_client = ndb.Client()
ppc_client = pubsub.PublisherClient()
psc_client = pubsub.SubscriberClient()
_, PROJECT_ID = google.auth.default()
TOP_PATH = ppc_client.topic_path(PROJECT_ID, TOPIC)
SUB_PATH = psc_client.subscription_path(PROJECT_ID, SBSCR)
Ziyaret verileri modeli güncellemeleri
Visit
veri modeli değişmez. Datastore erişimi, Cloud NDB API istemci bağlam yöneticisinin (ds_client.context()
) açık kullanımını gerektirir. Kodda bu, Datastore çağrılarını Python with
bloklarının içinde hem store_visit()
hem de fetch_visits()
içinde sarmalayacağı anlamına gelir. Bu güncelleme, 2. Modül'de ele alınan konuyla aynıdır.
Pub/Sub için en alakalı değişiklik, Görev Sırası pull görevinin sıraya alınmasını, Pub/Sub mesajının pullq
konusuna yayınlanmasıyla değiştirmektir. Bu güncellemeleri yapmadan önceki ve sonraki kodu aşağıda bulabilirsiniz:
ÖNCE:
class Visit(ndb.Model):
'Visit entity registers visitor IP address & timestamp'
visitor = ndb.StringProperty()
timestamp = ndb.DateTimeProperty(auto_now_add=True)
def store_visit(remote_addr, user_agent):
'create new Visit in Datastore and queue request to bump visitor count'
Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
QUEUE.add(taskqueue.Task(payload=remote_addr, method='PULL'))
def fetch_visits(limit):
'get most recent visits'
return Visit.query().order(-Visit.timestamp).fetch(limit)
SONRA:
class Visit(ndb.Model):
'Visit entity registers visitor IP address & timestamp'
visitor = ndb.StringProperty()
timestamp = ndb.DateTimeProperty(auto_now_add=True)
def store_visit(remote_addr, user_agent):
'create new Visit in Datastore and queue request to bump visitor count'
with ds_client.context():
Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
ppc_client.publish(TOP_PATH, remote_addr.encode('utf-8'))
def fetch_visits(limit):
'get most recent visits'
with ds_client.context():
return Visit.query().order(-Visit.timestamp).fetch(limit)
VisitorCount veri modeli güncellemeleri
VisitorCount
veri modeli değişmez ve aşağıda gösterildiği gibi, Datastore sorgusunun bir with
bloğunun içinde sarmalanması dışında fetch_counts()
işlemi yapar:
ÖNCE:
class VisitorCount(ndb.Model):
visitor = ndb.StringProperty(repeated=False, required=True)
counter = ndb.IntegerProperty()
def fetch_counts(limit):
'get top visitors'
return VisitorCount.query().order(-VisitorCount.counter).fetch(limit)
SONRA:
class VisitorCount(ndb.Model):
visitor = ndb.StringProperty(repeated=False, required=True)
counter = ndb.IntegerProperty()
def fetch_counts(limit):
'get top visitors'
with ds_client.context():
return VisitorCount.query().order(-VisitorCount.counter).fetch(limit)
Çalışan kodunu güncelle
Çalışan kodu, NDB'yi Cloud NDB ve Görev Sırası'nı Pub/Sub ile değiştirecek şekilde güncellenir ancak iş akışı aynı kalır.
- Cloud NDB bağlam yöneticisi
with
bloğunda Datastore çağrılarını sarmala. - Görev Sırası temizleme, pull sırasındaki tüm görevlerin silinmesini içerir. Pub/Sub ile "onay kimlikleri"
acks
içinde toplanır ve daha sonra silinir/onaylanır. - Görev Sırası pull görevleri, Pub/Sub mesajlarının çekilmesine benzer şekilde kiralanır. pull görevlerinin silinmesi görev nesnelerinin kendileriyle yapılırken Pub/Sub mesajları onay kimlikleri aracılığıyla silinir.
- Pub/Sub mesaj yükleri için bayt gerekir (Python dizeleri değil). Bu nedenle, sırasıyla bir konuya mesaj yayınlarken ve konudan mesaj çekerken UTF-8 kodlaması ve kod çözme işlemi uygulanır.
log_visitors()
değerini, az önce açıklanan değişiklikleri uygulayarak aşağıdaki güncellenmiş kodla değiştirin:
ÖNCE:
@app.route('/log')
def log_visitors():
'worker processes recent visitor counts and updates them in Datastore'
# tally recent visitor counts from queue then delete those tasks
tallies = {}
tasks = QUEUE.lease_tasks(HOUR, TASKS)
for task in tasks:
visitor = task.payload
tallies[visitor] = tallies.get(visitor, 0) + 1
if tasks:
QUEUE.delete_tasks(tasks)
# increment those counts in Datastore and return
for visitor in tallies:
counter = VisitorCount.query(VisitorCount.visitor == visitor).get()
if not counter:
counter = VisitorCount(visitor=visitor, counter=0)
counter.put()
counter.counter += tallies[visitor]
counter.put()
return 'DONE (with %d task[s] logging %d visitor[s])\r\n' % (
len(tasks), len(tallies))
SONRA:
@app.route('/log')
def log_visitors():
'worker processes recent visitor counts and updates them in Datastore'
# tally recent visitor counts from queue then delete those tasks
tallies = {}
acks = set()
rsp = psc_client.pull(subscription=SUB_PATH, max_messages=TASKS)
msgs = rsp.received_messages
for rcvd_msg in msgs:
acks.add(rcvd_msg.ack_id)
visitor = rcvd_msg.message.data.decode('utf-8')
tallies[visitor] = tallies.get(visitor, 0) + 1
if acks:
psc_client.acknowledge(subscription=SUB_PATH, ack_ids=acks)
try:
psc_client.close()
except AttributeError: # special handler for grpcio<1.12.0
pass
# increment those counts in Datastore and return
if tallies:
with ds_client.context():
for visitor in tallies:
counter = VisitorCount.query(VisitorCount.visitor == visitor).get()
if not counter:
counter = VisitorCount(visitor=visitor, counter=0)
counter.put()
counter.counter += tallies[visitor]
counter.put()
return 'DONE (with %d task[s] logging %d visitor[s])\r\n' % (
len(msgs), len(tallies))
root()
ana uygulama işleyicisinde değişiklik yok. templates/index.html
HTML şablon dosyasında da herhangi bir değişiklik yapmaya gerek olmadığından gerekli tüm güncellemeler tamamlanır. Cloud Pub/Sub'ı kullanarak yeni Modül 19 uygulamanıza ulaştığınız için tebrik ederiz.
7. Özet/Temizlik
Uygulamanızın beklendiği gibi çalıştığını ve yansıtılan herhangi bir çıktıda çalıştığını doğrulamak için uygulamanızı dağıtın. Ziyaretçi sayılarını işlemek için çalışanı da çalıştırın. Uygulama doğrulamasından sonra temizlik adımlarını uygulayın ve sonraki adımları değerlendirin.
Uygulamayı dağıtma ve doğrulama
pullq
konusunu ve worker
aboneliğini zaten oluşturduğunuzdan emin olun. Bu işlem tamamlandıysa ve örnek uygulamanız kullanıma hazırsa uygulamanızı gcloud app deploy
ile dağıtın. Temel sıraya ekleme mekanizmasının tamamını başarıyla değiştirmiş olmanız dışında, çıkış, Modül 18 uygulamasıyla aynı olmalıdır:
Uygulamanın web ucu artık uygulamanın bu kısmının çalıştığını doğrular. Uygulamanın bu bölümü en çok ziyaret edilen ziyaretçileri ve en son ziyaretleri başarılı bir şekilde sorgulayıp görüntülese de uygulamanın bu ziyareti kaydettiğini ve bu ziyaretçiyi toplam sayıya eklemek için bir pull görevi oluşturduğunu hatırlayın. Bu görev şu anda işlenmeyi bekleyen sırada.
Bunu bir App Engine arka uç hizmeti, bir cron
işi, /log
sayfasına göz atarak veya komut satırı HTTP isteği göndererek yürütebilirsiniz. Aşağıda, örnek yürütme ve çalışan kodunu curl
ile çağırma dışında bir örnek verilmiştir (PROJECT_ID
yerine aşağıdaki kodu kullanın):
$ curl https://PROJECT_ID.appspot.com/log DONE (with 1 task[s] logging 1 visitor[s])
Güncellenen sayı, bir sonraki web sitesi ziyaretinde yansıtılır. İşte bu kadar.
Temizleme
Genel
Şimdilik işiniz bittiyse faturalandırılma olmaması için App Engine uygulamanızı devre dışı bırakmanızı öneririz. Bununla birlikte, daha fazla test veya deneme yapmak isterseniz App Engine platformunun ücretsiz bir kotası vardır ve bu kullanım katmanını aşmadığınız sürece sizden ücret alınmaz. Burası işlem içindir, ancak ilgili App Engine hizmetleri için de ücret alınabilir. Daha fazla bilgi için fiyatlandırma sayfasına göz atın. Bu taşıma işlemi başka Cloud hizmetlerini içeriyorsa bunlar ayrı olarak faturalandırılır. Her iki durumda da (geçerliyse) "Bu codelab'e özel" bölümünü inceleyin bölümüne bakın.
Ayrıntılı açıklama için, App Engine gibi Google Cloud sunucusuz bilgi işlem platformuna dağıtım yapmak küçük derleme ve depolama maliyetleri gerektirir. Cloud Build'in ve Cloud Storage'ın kendi ücretsiz kotası vardır. Söz konusu resmin depolanması bu kotanın bir kısmını kullanır. Ancak, bu kadar ücretsiz katmanın olmadığı bir bölgede yaşıyor olabilirsiniz. Bu nedenle, olası maliyetleri en aza indirmek için depolama alanı kullanımınız konusunda dikkatli olun. Belirli Cloud Storage "klasörleri" şunları incelemeniz gerekir:
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
- Yukarıdaki depolama alanı bağlantıları
PROJECT_ID
ve *LOC
*ifadenize bağlıdır (örneğin, "us
") Uygulamanız ABD'de barındırılıyorsa.
Öte yandan, bu uygulamayı veya diğer ilgili taşıma codelab'lerini kullanmayacak ve her şeyi tamamen silmek istiyorsanız projenizi kapatın.
Bu codelab'e özel
Aşağıda listelenen hizmetler bu codelab'e özeldir. Daha fazla bilgi için her ürünün belgelerine bakın:
- Cloud Pub/Sub'ın farklı bileşenleri için ücretsiz bir katman bulunur; maliyet üzerindeki etkileri daha iyi anlamak için genel kullanımınızı belirleyin ve ayrıntılı bilgi için fiyatlandırma sayfasına göz atın.
- App Engine Datastore hizmeti, aynı zamanda ücretsiz bir katmana sahip olan Cloud Datastore (Data Store modunda Cloud Firestore) tarafından sağlanır; Daha fazla bilgi için fiyatlandırma sayfasını inceleyin.
Sonraki adımlar
Bu eğiticinin yanı sıra, eski paket servislerin kullanımdan kaldırılmasına odaklanan diğer taşıma modüllerini de göz önünde bulundurun:
- Modül 2: App Engine
ndb
'den Cloud NDB'ye geçiş - Modüller 7-9: App Engine Görev Sırası'ndan (push görevleri) Cloud Tasks'a geçiş
- Modüller 12-13: App Engine Memcache'den Cloud Memorystore'a taşıma
- Modüller 15-16: App Engine Blobstore'dan Cloud Storage'a taşıma
App Engine artık Google Cloud'daki tek sunucusuz platform değil. Küçük bir App Engine uygulamanız varsa veya sınırlı işlevselliğe sahip bir uygulamanız varsa ve bunu bağımsız bir mikro hizmete dönüştürmek ya da monolitik bir uygulamayı yeniden kullanılabilir birden fazla bileşene ayırmak istiyorsanız Cloud Functions'a geçmek için iyi nedenler olabilir. Container mimarisine alma işlemi, uygulama geliştirme iş akışınızın bir parçası haline geldiyse, özellikle de bir CI/CD (sürekli entegrasyon/sürekli teslim veya dağıtım) ardışık düzeninden oluşuyorsa Cloud Run'a geçiş yapmayı düşünün. Bu senaryolar aşağıdaki modüllerde ele alınmıştır:
- App Engine'den Cloud Functions'a geçiş: Modül 11'e bakın
- App Engine'den Cloud Run'a taşıma: Uygulamanızı Docker ile container mimarisine almak için Modül 4'e, bu işlemi container'lar, Docker bilgileri ya da
Dockerfile
olmadan yapmak için Modül 5'e bakın.
Başka bir sunucusuz platforma geçmek isteğe bağlıdır. Bu nedenle, herhangi bir değişiklik yapmadan önce uygulamalarınız ve kullanım alanlarınız için en iyi seçenekleri değerlendirmenizi öneririz.
Bir sonraki taşıma modülünden bağımsız olarak tüm Sunucusuz Taşıma İstasyonu içeriklerine (codelab'ler, videolar, kaynak kodu [kullanılabilir olduğunda]) açık kaynak deposundan erişebilirsiniz. Deponun README
özelliği, hangi taşıma işlemlerinin göz önünde bulundurulacağı ve ilgili "siparişler" hakkında da bilgi sağlar. göz atmanızı öneririm.
8. Ek kaynaklar
Aşağıda, geliştiricilerin bu veya ilgili Taşıma Modülü'nü ve ilgili ürünleri daha ayrıntılı bir şekilde inceleyen ek kaynaklar verilmiştir. Bu bölümde, söz konusu içerikle ilgili geri bildirimde bulunabileceğiniz yerler, kod bağlantıları ve yararlı bulabileceğiniz çeşitli belgeler yer alır.
Codelab sorunları/geri bildirimi
Bu codelab'de herhangi bir sorun bulursanız lütfen göndermeden önce sorununuzu arayın. Arama ve yeni sayı oluşturma bağlantıları:
Taşıma kaynakları
Modül 18 (START) ve Modül 19 (FINISH) için depo klasörlerinin bağlantılarını aşağıdaki tabloda bulabilirsiniz.
Codelab | Python 2 | Python 3 |
(Yok) | ||
Modül 19 (bu codelab) | (app.yaml'yi yukarıda açıklandığı şekilde güncellemediyseniz app3.yaml kullanma dışında Python 2 ile aynıdır) |
Online referanslar
Aşağıda bu eğitimle alakalı kaynaklar verilmiştir:
App Engine Görev Sırası
- App Engine Görev Sırası'na genel bakış
- App Engine Görev Sırası pull sıralarına genel bakış
- App Engine Görev Sırası pull sırası tam örnek uygulama
- Görev Sırası pull sıraları oluşturma
- Google I/O 2011 pull sırası lansman videosu ( Sanatçı örnek uygulaması)
queue.yaml
referansıqueue.yaml
ile Cloud Tasks karşılaştırması- Sıraları Pub/Sub taşıma rehberine çekme
Cloud Pub/Sub
- Cloud Pub/Sub ürün sayfası
- Pub/Sub istemci kitaplıklarını kullanma
- Pub/Sub Python istemci kitaplığı örnekleri
- Pub/Sub Python istemci kitaplığı belgeleri
- Oluştur ve Pub/Sub konularını yönetme
- Pub/Sub konu adlandırma kuralları
- Oluştur ve Pub/Sub aboneliklerini yönetme
- App Engine (Esnek) örnek uygulaması (Standard'a da dağıtılabilir; Python 3)
- Yukarıdaki örnek uygulama için depo
- Pub/Sub pull abonelikleri
- Pub/Sub push abonelikleri
- App Engine Pub/Sub push örnek uygulaması (Python 3)
- App Engine Pub/Sub push örnek uygulama deposu
- Pub/Sub fiyatlandırma bilgileri
- Cloud Tasks mı Cloud Pub/Sub mı? (push ve çekme)
App Engine NDB ve Cloud NDB (Datastore)
- App Engine NDB belgeleri
- App Engine NDB deposu
- Google Cloud NDB belgeleri
- Google Cloud NDB deposu
- Cloud Datastore fiyatlandırma bilgileri
App Engine platformu
- App Engine belgeleri
- Python 2 App Engine (standart ortam) çalışma zamanı
- Python 2 App Engine'de App Engine yerleşik kitaplıklarını kullanma
- Python 3 App Engine (standart ortam) çalışma zamanı
- Python 2 ile Python 2 arasındaki farklar 3 App Engine (standart ortam) çalışma zamanı
- Python 2'den 3'e App Engine (standart ortam) taşıma kılavuzu
- App Engine fiyatlandırması ve kota bilgileri
- İkinci nesil App Engine platformunun kullanıma sunulması (2018)
- Birinci ve ikinci nesil platformlar
- Eski çalışma zamanları için uzun süreli destek
- Belge taşıma örnekleri
- Topluluğun katkıda bulunduğu taşıma örnekleri
Diğer Cloud bilgileri
- Google Cloud Platform'da Python
- Google Cloud Python istemci kitaplıkları
- Google Cloud "Daima Ücretsiz" katman
- Google Cloud SDK'sı (
gcloud
komut satırı aracı) - Tüm Google Cloud belgeleri
Videolar
- Sunucusuz Taşıma İstasyonu
- Sunucusuz Keşif Seferleri
- Google Cloud Teknolojisi'ne abone olun
- Google Developers'a abone olun
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.