App Engine Görev Sırası Push Görevleri'nden Cloud Tasks'a Taşıma (8. Modül)

1. Genel Bakış

Serverless Migration Station serisi codelab'ler (kendi hızınızda ilerleyebileceğiniz, uygulamalı eğitimler) ve ilgili videolar, Google Cloud sunucusuz geliştiricilerin öncelikle eski hizmetlerden uzaklaşarak bir veya daha fazla taşıma işlemi yapmalarına rehberlik ederek uygulamalarını modernleştirmelerine yardımcı olmayı amaçlar. Bu sayede uygulamalarınız daha taşınabilir hale gelir, daha fazla seçenek ve esneklik elde edersiniz. Böylece daha geniş bir Cloud ürün yelpazesiyle entegrasyon yapabilir, bu ürünlere erişebilir ve yeni dil sürümlerine daha kolay yükseltebilirsiniz. Başlangıçta öncelikle App Engine (standart ortam) geliştiricileri olmak üzere en eski Cloud kullanıcılarına odaklanılsa da bu seri, Cloud Functions ve Cloud Run gibi diğer sunucusuz platformları veya uygun olduğu durumlarda başka platformları da kapsayacak kadar geniştir.

Bu codelab'in amacı, Python 2 App Engine geliştiricilerine App Engine görev sırasından (push görevleri) Cloud Tasks'e nasıl geçiş yapacaklarını göstermektir. Ayrıca, Datastore erişimi için App Engine NDB'den Cloud NDB'ye örtülü bir taşıma da vardır (bu konu, öncelikle 2. modülde ele alınır).

7. modülde push görevlerinin kullanımını ekledik, 8. modülde bu kullanımı Cloud Tasks'e taşıdık ve 9. modülde Python 3 ile Cloud Datastore'a geçtik. Çekme görevleri için görev sıralarını kullananlar Cloud Pub/Sub'a geçecek ve bunun yerine 18-19. modüllere başvurmalıdır.

Bu demoda aşağıdaki işlemleri yapmayı öğreneceksiniz:

İhtiyacınız olanlar

Anket

Bu eğitimi nasıl kullanacaksınız?

Yalnızca okuyun Okuyun ve alıştırmaları tamamlayın

Python ile ilgili deneyiminizi nasıl değerlendirirsiniz?

Yeni başlayan Orta düzey Uzman

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

Başlangıç Orta İleri

2. Arka plan

App Engine görev sırası hem push hem de çekme görevlerini destekler. Uygulama taşınabilirliğini iyileştirmek için Google Cloud Ekibi, Task Queue gibi eski paketlenmiş hizmetlerden diğer Cloud bağımsız veya üçüncü taraf eşdeğer hizmetlerine geçiş yapmanızı önerir.

Çekme görevlerini taşıma işlemi 18-19. taşıma modüllerinde, gönderme görevlerini taşıma işlemi ise 7-9. modüllerde ele alınır. App Engine görev sırası push görevlerinden geçiş yapmak için bu görevin kullanımını, yeni sayfa ziyaretlerini kaydeden ve en son ziyaretleri gösteren mevcut Python 2 App Engine örnek uygulamasına ekledik. 7. Modül codelab'i, en eski ziyaretleri silmek için bir push görevi ekler. Bu ziyaretler bir daha asla gösterilmeyeceğinden Datastore'da neden ek depolama alanı kaplasın? Bu 8. modül codelab'i aynı işlevselliği korur ancak temel sıralama mekanizmasını Task Queue push görevlerinden Cloud Tasks'e taşır ve Datastore erişimi için App Engine NDB'den Cloud NDB'ye 2. modül taşıma işlemini tekrarlar.

Bu eğitimde aşağıdaki adımlar yer almaktadır:

  1. Kurulum/Ön Hazırlık
  2. Yapılandırmayı güncelleyin
  3. Uygulama kodunu değiştirme

3. Kurulum/Ön Hazırlık

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

  1. Cloud projenizi ayarlama
  2. Temel örnek uygulamayı edinme
  3. Temel uygulamayı (yeniden) dağıtma ve doğrulama
  4. Yeni Google Cloud hizmetlerini/API'lerini etkinleştirme

Bu adımlar, çalışır durumda olan bir kodla başlamanızı ve örnek uygulamanızın bulut hizmetlerine taşınmaya hazır olmasını sağlar.

1. Proje oluşturma

7. modül codelab'ini tamamladıysanız aynı projeyi (ve kodu) yeniden kullanın. Alternatif olarak, yepyeni bir proje oluşturun veya mevcut başka bir projeyi yeniden kullanın. Projenin etkin bir faturalandırma hesabına ve etkin bir App Engine uygulamasına sahip olduğundan emin olun. Bu codelab sırasında ihtiyacınız olacağı için proje kimliğinizi bulun. PROJECT_ID değişkeniyle karşılaştığınızda proje kimliğinizi kullanın.

2. Temel örnek uygulamayı edinme

Ön koşullardan biri, çalışan bir 7. Modül App Engine uygulamasıdır: 7. Modül codelab'ini tamamlayın (önerilir) veya 7. Modül uygulamasını depodan kopyalayın. Sizinkini veya bizimkini kullanıyor olmanız fark etmez. 7. Modül koduna ("START") bakarak başlayacağız. Bu codelab, 8. modülün depo klasöründeki ("FINISH") koda benzeyen bir kodla sonuçlanan taşıma işleminde size yol gösterir.

Hangi 7. Modül uygulamasını kullanırsanız kullanın, klasör aşağıdaki gibi görünmelidir. Klasörde lib klasörü de olabilir:

$ ls
README.md               appengine_config.py     requirements.txt
app.yaml                main.py                 templates

3. Temel uygulamayı (yeniden) dağıtma ve doğrulama

7. Modül 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üklediğinizden ve başlattığınızdan emin olun ve kullanımını inceleyin.
  3. (İsteğe bağlı) Her gcloud komutunu verdiğinizde PROJECT_ID değerini girmek istemiyorsanız Cloud projenizi gcloud config set project PROJECT_ID ile ayarlayın.
  4. Örnek uygulamayı gcloud app deploy ile dağıtma
  5. Uygulamanın sorunsuz ve beklendiği gibi çalıştığını doğrulayın. 7. modülün codelab'ini tamamladıysanız uygulamada en son ziyaretlerle birlikte en çok ziyaret eden kullanıcılar gösterilir (aşağıda gösterilmiştir). En altta, silinecek eski görevler gösterilir.

4aa8a2cb5f527079.png

4. Yeni Google Cloud hizmetlerini/API'lerini etkinleştirme

Eski uygulama, ek kurulum gerektirmeyen App Engine paketlenmiş hizmetlerini kullanıyordu. Ancak bağımsız Cloud hizmetleri ek kurulum gerektirir ve güncellenen uygulama hem Cloud Tasks hem de Cloud Datastore'u (Cloud NDB istemci kitaplığı aracılığıyla) kullanacak. App Engine, Cloud Datastore ve Cloud Tasks dahil olmak üzere birçok Cloud ürününde "Daima Ücretsiz" katman kotaları bulunur. Bu sınırları aşmadığınız sürece bu eğitimi tamamlarken herhangi bir ücret ödemezsiniz. Cloud API'leri, tercihinize bağlı olarak Cloud Console'dan veya komut satırından etkinleştirilebilir.

Cloud Console'dan

Cloud Console'da API Yöneticisi Kitaplığı sayfasına (doğru proje için) gidin ve sayfanın ortasındaki arama çubuğunu kullanarak Cloud Datastore ve Cloud Tasks API'lerini arayın:

c7a740304e9d35b.png

Her API için Etkinleştir düğmesini ayrı ayrı tıklayın. Fatura bilgileri istenebilir. Bu, Cloud Pub/Sub API Kitaplığı sayfasını içeren bir örnektir (bu codelab için Pub/Sub API'yi etkinleştirmeyin, yalnızca Cloud Tasks ve Datastore'u etkinleştirin):

1b6c0a2a73124f6b.jpeg

Komut satırından

Konsoldan API'leri etkinleştirmek görsel olarak bilgilendirici olsa da bazı kullanıcılar komut satırını tercih eder. Her iki API'yi de aynı anda etkinleştirmek için gcloud services enable cloudtasks.googleapis.com datastore.googleapis.com komutunu verin:

$ gcloud services enable cloudtasks.googleapis.com datastore.googleapis.com
Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

Fatura bilgileri istenebilir. Diğer Cloud API'lerini etkinleştirmek ve "URI'lerinin" ne olduğunu öğrenmek istiyorsanız bu bilgileri her API'nin Kitaplık sayfasının en altında bulabilirsiniz. Örneğin, hemen yukarıdaki Pub/Sub sayfasının en alt kısmında "Hizmet adı" olarak pubsub.googleapis.com ifadesini görebilirsiniz.

Adımlar tamamlandıktan sonra projeniz API'lere erişebilir. Şimdi uygulamayı bu API'leri kullanacak şekilde güncelleme zamanı.

4. Yapılandırmayı güncelleyin

Yapılandırmadaki güncellemeler, Cloud istemci kitaplıklarının eklenmesinden kaynaklanmaktadır. Hangisini kullandığınızdan bağımsız olarak, hiçbir Cloud istemci kitaplığını kullanmayan uygulamalarda aynı değişiklikler yapılmalıdır.

requirements.txt

8. modülde, 1. modüldeki App Engine NDB ve Görev Sırası yerine Cloud NDB ve Cloud Tasks kullanılır. 7. modüldeki flask toplantısına katılmak için hem google-cloud-ndb hem de google-cloud-tasks değerini requirements.txt değerine ekleyin:

flask
google-cloud-ndb
google-cloud-tasks

Bu requirements.txt dosyasında sürüm numaraları yer almaz. Bu nedenle, en son sürümler seçilir. Uyumsuzluklar ortaya çıkarsa uygulamanın çalışan sürümlerini kilitlemek için bir sürüm numarası belirtin.

app.yaml

Cloud istemci kitaplıkları kullanılırken Python 2 App Engine çalışma zamanı, grpcio ve setuptools olmak üzere belirli üçüncü taraf paketleri gerektirir. Python 2 kullanıcıları, bu gibi yerleşik kitaplıkları app.yaml içinde kullanılabilir bir sürüm veya "en son" ile birlikte listelemelidir. Henüz bir libraries bölümünüz yoksa bir tane oluşturun ve her iki kitaplığı da aşağıdaki gibi ekleyin:

libraries:
- name: grpcio
  version: latest
- name: setuptools
  version: latest

Uygulamanızı taşırken libraries bölümü olabilir. Bu durumda, grpcio ve setuptools değerlerinden biri eksikse bunları mevcut libraries bölümünüze eklemeniz yeterlidir. Güncellenen app.yaml artık aşağıdaki gibi görünmelidir:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

libraries:
- name: grpcio
  version: latest
- name: setuptools
  version: latest

appengine_config.py

appengine_config.py içindeki google.appengine.ext.vendor.add() çağrısı, lib içindeki kopyalanmış (bazen "satıcıdan alınan" veya "kendinden paketlenmiş" olarak da adlandırılır) üçüncü taraf kitaplıklarınızı uygulamanıza bağlar. Yukarıdaki app.yaml içinde yerleşik üçüncü taraf kitaplıkları ekledik. Bunlar, uygulamanızı lib içindeki bu yerleşik paketlere bağlamak için setuptools.pkg_resources.working_set.add_entry() gerektirir. Aşağıda, orijinal 1. Modül appengine_config.py ve 8. Modül güncellemelerini yaptıktan sonraki hali yer almaktadır:

ÖNCESİ:

from google.appengine.ext import vendor

# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)

SONRASI:

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)

Benzer bir açıklamayı App Engine taşıma belgelerinde de bulabilirsiniz.

5. Uygulama kodunu değiştirme

Bu bölümde, ana uygulama dosyasında main.py yapılan güncellemeler yer almaktadır. Bu güncellemeler, App Engine görev sırası push sıralarının Cloud Tasks ile değiştirilmesini sağlar. Web şablonunda değişiklik yapılmamıştır. templates/index.html—Her iki uygulama da aynı şekilde çalışmalı ve aynı verileri göstermelidir. Ana uygulamada yapılan değişiklikler şu dört "yapılacaklar" listesine ayrılmıştır:

  1. İçe aktarma işlemlerini ve başlatmayı güncelleme
  2. Veri modeli işlevselliğini güncelleme (Cloud NDB)
  3. Cloud Tasks'e (ve Cloud NDB'ye) taşıma
  4. Güncelleme (push) görev işleyicisi

1. İçe aktarma işlemlerini ve başlatmayı güncelleme

  1. App Engine NDB (google.appengine.ext.ndb) ve Görev Sırası'nı (google.appengine.api.taskqueue) sırasıyla Cloud NDB (google.cloud.ndb) ve Cloud Tasks (google.cloud.tasks) ile değiştirin.
  2. Cloud istemci kitaplıkları, "API istemcilerinin" başlatılmasını ve oluşturulmasını gerektirir. Bunları sırasıyla ds_client ve ts_client'ye atayın.
  3. Görev sırası dokümanlarında şu ifade yer alır: "App Engine, default adlı varsayılan bir push sırası sağlar. Bu sıra, varsayılan ayarlarla yapılandırılmış ve kullanıma hazırdır." Cloud Tasks, default sırası sağlamaz (App Engine'den bağımsız, bağımsız bir Cloud ürünü olduğundan). Bu nedenle, default adlı bir Cloud Tasks sırası oluşturmak için yeni kod gerekir.
  4. App Engine görev sırası, uygulamanızın çalıştığı bölgeyi kullandığından bölge belirtmenizi gerektirmez. Ancak Cloud Tasks artık bağımsız bir ürün olduğundan bir bölge gerektirir ve bu bölge, uygulamanızın çalıştığı bölgeyle eşleşmelidir. Kuyruğun benzersiz tanımlayıcısı olarak "tam nitelikli bir yol adı" oluşturmak için bölge adı ve Cloud projesi kimliği gereklidir.

Yukarıdaki üçüncü ve dördüncü maddede açıklanan güncellemeler, gereken ek sabitlerin ve başlatmanın büyük bir kısmını oluşturur. Aşağıdaki "önce" ve "sonra" bölümlerine bakın ve main.py üst kısmında bu değişiklikleri yapın.

ÖNCESİ:

from datetime import datetime
import logging
import time
from flask import Flask, render_template, request
from google.appengine.api import taskqueue
from google.appengine.ext import ndb

app = Flask(__name__)

SONRASI:

from datetime import datetime
import json
import logging
import time
from flask import Flask, render_template, request
from google.cloud import ndb, tasks

app = Flask(__name__)
ds_client = ndb.Client()
ts_client = tasks.CloudTasksClient()

_, PROJECT_ID = google.auth.default()
REGION_ID = 'REGION_ID'    # replace w/your own
QUEUE_NAME = 'default'     # replace w/your own
QUEUE_PATH = ts_client.queue_path(PROJECT_ID, REGION_ID, QUEUE_NAME)

2. Veri modeli işlevselliğini güncelleme (Cloud NDB)

App Engine NDB ve Cloud NDB neredeyse aynı şekilde çalışır. Veri modelinde veya store_visit() işlevinde büyük bir değişiklik yapılmamıştır. Tek fark, store_visit() içindeki Visit öğesinin oluşturulmasının artık bir Python with bloğu içinde kapsanmasıdır. Cloud NDB, tüm Datastore erişiminin bağlam yöneticisi içinde kontrol edilmesini gerektirir. Bu nedenle with ifadesi kullanılır. Aşağıdaki kod snippet'leri, Cloud NDB'ye geçiş yaparken bu küçük farkı gösterir. Bu değişikliği uygulayın.

ÖNCESİ:

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 entity in Datastore'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

SONRASI:

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 entity in Datastore'
    with ds_client.context():
        Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

3. Cloud Tasks'e (ve Cloud NDB'ye) taşıma

Bu taşıma işlemindeki en kritik değişiklik, temel sıralama altyapısını değiştirir. Bu işlem, eski ziyaretleri silmek için bir (push) görevinin oluşturulduğu ve yürütülmek üzere sıraya alındığı fetch_visits() işlevinde gerçekleşir. Ancak 7. modüldeki orijinal işlevler değişmeden kalır:

  1. En son ziyaretlerle ilgili sorgu.
  2. Bu ziyaretleri hemen döndürmek yerine, en eski gösterilen son Visit'nın zaman damgasını kaydedin. Bundan daha eski tüm ziyaretleri silebilirsiniz.
  3. Standart Python yardımcı programlarını kullanarak zaman damgasını kayan nokta ve dize olarak ayırın ve her ikisini de çeşitli kapasitelerde kullanın (ör. kullanıcıya gösterme, günlükleri ekleme, işleyiciye geçirme vb.).
  4. URL olarak /trim ile birlikte bu zaman damgasını yük olarak içeren bir push görevi oluşturun.
  5. Görev işleyici, sonunda bu URL'ye bir HTTP POST aracılığıyla çağrılır.

Bu iş akışı, "önce" kod snippet'inde gösterilmektedir:

ÖNCESİ:

def fetch_visits(limit):
    'get most recent visits & add task to delete older visits'
    data = Visit.query().order(-Visit.timestamp).fetch(limit)
    oldest = time.mktime(data[-1].timestamp.timetuple())
    oldest_str = time.ctime(oldest)
    logging.info('Delete entities older than %s' % oldest_str)
    taskqueue.add(url='/trim', params={'oldest': oldest})
    return data, oldest_str

İşlevler aynı kalırken Cloud Tasks, yürütme platformu haline gelir. Bu değişikliği etkileyecek güncellemeler şunlardır:

  1. Visit sorgusunu Python with bloğuna sarmalama (Module 2'deki Cloud NDB'ye taşıma işlemini tekrarlama)
  2. Zaman damgası yükü ve URL gibi beklenen özellikleri içeren Cloud Tasks meta verileri oluşturun. Ayrıca MIME türünü ekleyin ve yükü JSON olarak kodlayın.
  3. Kuyruğun meta verileri ve tam yol adıyla görevi oluşturmak için Cloud Tasks API istemcisini kullanın.

fetch_visits() ile ilgili bu değişiklikler aşağıda gösterilmiştir:

SONRASI:

def fetch_visits(limit):
    'get most recent visits & add task to delete older visits'
    with ds_client.context():
        data = Visit.query().order(-Visit.timestamp).fetch(limit)
    oldest = time.mktime(data[-1].timestamp.timetuple())
    oldest_str = time.ctime(oldest)
    logging.info('Delete entities older than %s' % oldest_str)
    task = {
        'app_engine_http_request': {
            'relative_uri': '/trim',
            'body': json.dumps({'oldest': oldest}).encode(),
            'headers': {
                'Content-Type': 'application/json',
            },
        }
    }
    ts_client.create_task(parent=QUEUE_PATH, task=task)
    return data, oldest_str

4. Güncelleme (push) görev işleyicisi

(Push) görev işleyici işlevinin büyük güncellemeler gerektirmez, yalnızca yürütülmesi gerekir. Bu, Görev Sırası veya Cloud Tasks için geçerlidir. "Kod, koddur" derler. Ancak bazı küçük değişiklikler var:

  1. Zaman damgası yükü, Task Queue'ya olduğu gibi iletildi ancak Cloud Tasks için JSON kodlu olduğundan geldiğinde JSON olarak ayrıştırılması gerekir.
  2. Task Queue ile /trim için yapılan HTTP POST çağrısının örtülü bir MIME türü application/x-www-form-urlencoded vardı ancak Cloud Tasks'te bu tür açıkça application/json olarak belirlendiğinden yükü ayıklamak için biraz farklı bir yöntem kullanılıyor.
  3. Cloud NDB API istemci bağlamı yöneticisini kullanın (Module 2 migration to Cloud NDB).

Aşağıda, görev işleyici trim()'de bu değişiklikler yapılmadan önceki ve sonraki kod snippet'leri yer almaktadır:

ÖNCESİ:

@app.route('/trim', methods=['POST'])
def trim():
    '(push) task queue handler to delete oldest visits'
    oldest = request.form.get('oldest', type=float)
    keys = Visit.query(
            Visit.timestamp < datetime.fromtimestamp(oldest)
    ).fetch(keys_only=True)
    nkeys = len(keys)
    if nkeys:
        logging.info('Deleting %d entities: %s' % (
                nkeys, ', '.join(str(k.id()) for k in keys)))
        ndb.delete_multi(keys)
    else:
        logging.info('No entities older than: %s' % time.ctime(oldest))
    return ''   # need to return SOME string w/200

SONRASI:

@app.route('/trim', methods=['POST'])
def trim():
    '(push) task queue handler to delete oldest visits'
    oldest = float(request.get_json().get('oldest'))
    with ds_client.context():
        keys = Visit.query(
                Visit.timestamp < datetime.fromtimestamp(oldest)
        ).fetch(keys_only=True)
        nkeys = len(keys)
        if nkeys:
            logging.info('Deleting %d entities: %s' % (
                    nkeys, ', '.join(str(k.id()) for k in keys)))
            ndb.delete_multi(keys)
        else:
            logging.info(
                    'No entities older than: %s' % time.ctime(oldest))
    return ''   # need to return SOME string w/200

Ana uygulama işleyicisi root() veya web şablonunda templates/index.html güncelleme yoktur.

6. Özet/Temizleme

Bu bölümde, uygulamayı dağıtarak, amaçlandığı gibi çalıştığını ve yansıtılan tüm çıktılarda çalıştığını doğrulayarak bu codelab'i tamamlıyoruz. Uygulama doğrulandıktan sonra temizleme işlemlerini yapın ve sonraki adımları göz önünde bulundurun.

Uygulamayı dağıtma ve doğrulama

Uygulamanızı gcloud app deploy ile dağıtın. Çıkış, 7. Modül'deki uygulamayla aynı olmalıdır ancak tamamen farklı bir push sırası ürününe geçtiğiniz için uygulamanızın artık daha taşınabilir olduğunu unutmayın.

4aa8a2cb5f527079.png

Temizleme

Genel

Şimdilik işiniz bittiyse faturalandırmayı önlemek için App Engine uygulamanızı devre dışı bırakmanızı öneririz. Ancak biraz daha test veya deneme yapmak isterseniz App Engine platformunda ücretsiz kota bulunur. Bu nedenle, kullanım katmanını aşmadığınız sürece sizden ücret alınmaz. Bu, işlem için geçerlidir ancak ilgili App Engine hizmetleri için de ücret alınabilir. Daha fazla bilgi için fiyatlandırma sayfasını inceleyin. Bu taşıma işlemine başka Cloud hizmetleri de dahilse bunlar ayrı olarak faturalandırılır. Her iki durumda da varsa aşağıdaki "Bu codelab'e özel" bölümüne bakın.

Tam açıklama yapmak gerekirse App Engine gibi bir Google Cloud sunucusuz bilgi işlem platformuna dağıtım yapıldığında küçük derleme ve depolama maliyetleri oluşur. Cloud Build ve Cloud Storage'ın kendi ücretsiz kotaları vardır. Bu görüntünün depolanması, kotanın bir kısmını kullanır. Ancak, böyle bir ücretsiz katmanın olmadığı bir bölgede yaşıyor olabilirsiniz. Bu nedenle, olası maliyetleri en aza indirmek için depolama alanı kullanımınıza dikkat edin. İncelemeniz gereken belirli Cloud Storage "klasörleri" şunlardır:

  • 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 bağlantıları, PROJECT_ID ve *LOC*ınıza bağlıdır. Örneğin, uygulamanız ABD'de barındırılıyorsa "us" olur.

Öte yandan, bu uygulamaya veya ilgili diğer taşıma codelab'lerine devam etmeyecekseniz 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:

Sonraki adımlar

App Engine görev sırası push görevlerinden Cloud Tasks'e geçişimiz tamamlandı. Bu uygulamayı Python 3'e taşımaya ve Cloud NDB'den Cloud Datastore'a geçirmeye devam etmek istiyorsanız 9. Modül'e göz atın.

Cloud NDB, özellikle Python 2 App Engine geliştiricileri için oluşturulmuştur ve neredeyse aynı kullanıcı deneyimini sunar. Ancak Cloud Datastore'un, App Engine kullanmayanlar veya yeni (Python 3) App Engine kullanıcıları için oluşturulmuş kendi yerel istemci kitaplığı vardır. Ancak Cloud NDB, Python 2 ve 3 için kullanılabildiğinden Cloud Datastore'a geçiş yapmanız gerekmez.

Cloud NDB ve Cloud Datastore, Datastore'a (farklı şekillerde olsa da) erişir. Bu nedenle, Cloud Datastore'a geçmeyi düşünmenizin tek nedeni, Cloud Datastore'u kullanan başka uygulamalarınızın (özellikle App Engine dışı uygulamalar) olması ve tek bir Datastore istemci kitaplığı kullanmak istemenizdir. Cloud NDB'den Cloud Datastore'a isteğe bağlı bu geçiş, 3. Modül'de de (Task Queue veya Cloud Tasks olmadan) ayrı olarak ele alınmaktadır.

3, 8 ve 9. modüllerin yanı sıra App Engine'in eski paketlenmiş hizmetlerinden geçişe odaklanan diğer taşıma modülleri şunlardır:

App Engine artık Google Cloud'daki tek sunucusuz platform değil. Küçük bir App Engine uygulamanız veya sınırlı işlevselliğe sahip bir uygulamanız varsa ve bunu bağımsız bir mikro hizmete dönüştürmek istiyorsanız ya da tek bir uygulamayı birden fazla yeniden kullanılabilir bileşene ayırmak istiyorsanız Cloud Functions'a geçmeyi düşünebilirsiniz. Container mimarisine alma, özellikle CI/CD (sürekli entegrasyon/sürekli teslim veya dağıtım) ardışık düzeninden oluşuyorsa uygulama geliştirme iş akışınızın bir parçası haline geldiyse Cloud Run'a geçmeyi düşünebilirsiniz. Bu senaryolar aşağıdaki modüllerde ele alınır:

  • App Engine'den Cloud Functions'a geçiş: 11. Modül'e bakın.
  • App Engine'den Cloud Run'a taşıma: Uygulamanızı Docker ile container mimarisine almak için 4. Modül'e, container'lar, Docker bilgisi veya Dockerfile olmadan yapmak için 5. Modül'e bakın.

Başka bir sunucusuz platforma geçmek isteğe bağlıdır. Herhangi bir değişiklik yapmadan önce uygulamalarınız ve kullanım alanlarınız için en iyi seçenekleri göz önünde bulundurmanızı öneririz.

Bir sonraki geçiş modülünüz hangisi olursa olsun, tüm Serverless Migration Station içeriklerine (codelab'ler, videolar, kaynak kodu [varsa]) açık kaynaklı depodan erişebilirsiniz. Depodaki README, hangi taşımaların dikkate alınması gerektiği ve ilgili "sıra" hakkında da rehberlik sağlar.

7. Ek kaynaklar

Bu veya ilgili geçiş modülünü ve ilgili ürünleri daha ayrıntılı incelemek isteyen geliştiriciler için ek kaynaklar aşağıda listelenmiştir. Bu sayfada, içerikle ilgili geri bildirimde bulunabileceğiniz yerler, kod bağlantıları ve faydalı bulabileceğiniz çeşitli belgeler yer alır.

Codelab'lerle ilgili sorunlar/geri bildirimler

Bu codelab ile ilgili sorun bulursanız lütfen göndermeden önce sorununuzu arayın. Arama yapma ve yeni sorunlar oluşturma bağlantıları:

Taşıma kaynakları

7. Modül (BAŞLANGIÇ) ve 8. Modül (BİTİŞ) ile ilgili depo klasörlerinin bağlantılarını aşağıdaki tabloda bulabilirsiniz.

Codelab

Python 2

Python 3

Modül 7

code

kod (bu eğitimde yer almaz)

8. Modül (bu codelab)

code

(yok)

Online kaynaklar

Bu eğitimle ilgili olabilecek online kaynakları aşağıda bulabilirsiniz:

App Engine görev sırası ve Cloud Tasks

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.