App Engine Görev Sırası pull görevlerini Cloud Pub/Sub'a taşıma (Modül 19)

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:

Gerekenler

Anket

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca baştan sona oku Okuyun ve alıştırmaları tamamlayın

Python deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

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.

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:

  1. Kurulum/Ön Çalışma
  2. Yapılandırmayı güncelleyin
  3. Uygulama kodunu değiştir

3. Kurulum/Ön Çalışma

Bu bölümde aşağıdakilerin nasıl yapılacağı açıklanmaktadır:

  1. Cloud projenizi oluşturun
  2. Temel örnek uygulamayı al
  3. Temel uygulamayı (yeniden) dağıtma ve doğrulama
  4. 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.

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:

  1. Varsa lib klasörünü silin ve lib öğesini yeniden doldurmak için pip install -t lib -r requirements.txt komutunu çalıştırın. Geliştirme makinenizde hem Python 2 hem de 3 yüklüyse pip2 kullanmanız gerekebilir.
  2. gcloud komut satırı aracını yükleyip başlattığınızdan ve kullanımını incelediğinizden emin olun.
  3. (İsteğe bağlı) Verdiğiniz her gcloud komutuyla birlikte PROJECT_ID girmek istemiyorsanız Cloud projenizi gcloud config set project PROJECT_ID olarak ayarlayın.
  4. Örnek uygulamayı gcloud app deploy ile dağıtın
  5. 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.

b667551dcbab1a09.png

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:

c7a740304e9d35b.png

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:

1b6c0a2a73124f6b.jpeg

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:

  1. 18. Modül, queue.yaml dosyasını kullanarak pullq adlı bir pull sırası oluşturdu.
  2. Uygulama, ziyaretçileri izlemek için pull sırasına görevler ekler.
  3. Görevler sonunda bir çalışan tarafından işlenir ve sınırlı bir süre (bir saat) için kiralanır.
  4. Son ziyaretçi sayılarını hesaplamak için görevler yürütüldü.
  5. 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:

  1. Uygulama, pull sırası yerine pullq adlı bir konu kullanır.
  2. Uygulama, pull sırasına görev eklemek yerine bir konuya (pullq) mesajlar gönderir.
  3. worker adlı bir abone, görevleri pull sırasından kiralayan bir çalışan yerine, mesajları pullq konusundan alır.
  4. Uygulama, mesaj yüklerini işleyerek Datastore'da ziyaretçi sayısını artırır.
  5. 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:

  1. Cloud konsolundan
  2. Komut satırından veya
  3. 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:

  1. Cloud Console Pub/Sub Konuları sayfasına gidin.
  2. En üstteki Konu oluştur'u tıklayın; yeni bir iletişim penceresi açılır (aşağıdaki resme bakın)
  3. Konu Kimliği alanına pullq yazın.
  4. İşaretli tüm seçeneklerin seçimini kaldırın ve Google tarafından yönetilen şifreleme anahtarı'nı seçin.
  5. Konu oluştur düğmesini tıklayın.

Konu oluşturma iletişim kutusu şu şekilde görünür:

a05cfdbf64571ceb.png

Artık bir konunuz olduğuna göre o konu için abonelik oluşturmanız gerekir:

  1. Cloud Console Pub/Sub Abonelikleri sayfasına gidin.
  2. En üstteki Abonelik oluştur'u tıklayın (aşağıdaki resme bakın).
  3. Abonelik Kimliği alanına worker girin.
  4. 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
  5. Yayınlama türü için Çekme'yi seçin.
  6. 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:

c5444375c20b0618.jpeg

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:

  1. İçe aktarma işlemleri için App Engine NDB ve Görev Sırası'nı Cloud NDB ve Pub/Sub ile değiştirin.
  2. QUEUE olan pullq adını TOPIC olarak değiştirin.
  3. 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.
  4. 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.
  5. 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.
  6. 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.

  1. Cloud NDB bağlam yöneticisi with bloğunda Datastore çağrılarını sarmala.
  2. 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.
  3. 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.
  4. 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:

b667551dcbab1a09.png

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

18. Modül

kod

(Yok)

Modül 19 (bu codelab)

kod

(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ı

Cloud Pub/Sub

App Engine NDB ve Cloud NDB (Datastore)

App Engine platformu

Diğer Cloud bilgileri

Videolar

Lisans

Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.