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'de, 1. Modül codelab'indeki örnek uygulamada App Engine görev kuyruğu push görevlerini nasıl kullanacağınız öğretilmektedir. 7. Modül blog yayını ve videosu, bu eğiticiyi tamamlayarak eğiticideki içeriklere dair kısa bir genel bakış sunar.
Bu modülde push görevlerinin kullanımını ekleyeceğiz. Ardından, bu kullanımı 8. modülde Cloud Tasks'e, 9. modülde ise Python 3 ve Cloud Datastore'a taşıyacağız. Ç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:
- App Engine Görev Sırası API'sini/paketlenmiş hizmetini kullanma
- Temel bir Python 2 Flask App Engine NDB uygulamasına push görev kullanımı ekleme
İhtiyacınız olanlar
- Etkin bir GCP faturalandırma hesabına sahip bir Google Cloud projesi
- Temel Python becerileri
- Yaygın Linux komutları hakkında çalışma bilgisi
- App Engine uygulamalarını geliştirme ve dağıtma hakkında temel bilgiler
- Çalışan bir 1. Modül App Engine uygulaması (codelab'ini tamamlayın [önerilir] veya uygulamayı depodan kopyalayın)
Anket
Bu eğitimi nasıl kullanacaksınız?
Python ile ilgili 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 ç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.
- Task Queue push görev kullanıcıları Cloud Tasks'e geçiş yapmalıdır.
- Görev sırası çekme görevi kullanıcıları Cloud Pub/Sub'a geçmelidir.
Ç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 Task Queue push görevlerinden geçiş yapmak için 1. Modül Codelab'i sonucunda elde edilen mevcut Flask ve App Engine NDB uygulamasına kullanımını ekleyin. Bu uygulamada, yeni bir sayfa görüntüleme yeni bir ziyaret olarak kaydedilir ve kullanıcıya en son ziyaretler gösterilir. Eski ziyaretler bir daha asla gösterilmediği ve veri deposunda yer kapladığı için en eski ziyaretleri otomatik olarak silmek üzere bir push görevi oluşturacağız. 8. modülde bu uygulamayı görev sırasından Cloud Tasks'e taşıyacağız.
Bu eğitimde aşağıdaki adımlar yer almaktadır:
- Kurulum/Ön Hazırlık
- Yapılandırmayı güncelleyin
- 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:
- Cloud projenizi ayarlama
- Temel örnek uygulamayı edinme
- Temel uygulamayı (yeniden) dağıtma ve doğrulama
Bu adımlar, çalışan bir kodla başlamanızı sağlar.
1. Proje oluşturma
1. Modül codelab'ini tamamladıysanız aynı projeyi (ve kodu) yeniden kullanmanızı öneririz. Alternatif olarak, yepyeni bir proje oluşturabilir veya mevcut başka bir projeyi yeniden kullanabilirsiniz. Projenin etkin bir faturalandırma hesabına sahip olduğundan ve App Engine'in etkinleştirildiğinden emin olun.
2. Temel örnek uygulamayı edinme
Bu codelab'in ön koşullarından biri, çalışan bir 1. Modül App Engine uygulamasının olmasıdır: 1. Modül codelab'ini tamamlayın (önerilir) veya 1. Modül uygulamasını depodan kopyalayın. Sizinkini veya bizimkini kullanıyor olmanız fark etmez. 1. Modül kodu, "BAŞLAYACAĞIMIZ" yerdir. Bu codelab, her adımı ayrıntılı olarak açıklar ve 7. modülün "FINISH" adlı depo klasöründeki koda benzer bir kodla sonuçlanır.
- BAŞLANGIÇ: Module 1 folder (Python 2)
- BİTİRME: Module 7 folder (Python 2)
- Deponun tamamı (ZIP dosyasını klonlamak veya indirmek için)
1. Modül uygulamasından hangisini kullanırsanız kullanın, klasör aşağıdaki gibi görünmelidir. Klasörde lib klasörü de olabilir:
$ ls README.md main.py templates app.yaml requirements.txt
3. Temel uygulamayı (yeniden) dağıtma
1. Modül uygulamasını (yeniden) dağıtmak için aşağıdaki adımları uygulayın:
- Varsa
libklasörünü silin veliböğesini yeniden doldurmak içinpip install -t lib -r requirements.txtkomutunu çalıştırın. Hem Python 2 hem de 3 yüklüyse bunun yerinepip2komutunu kullanmanız gerekebilir. gcloudkomut satırı aracını yüklediğinizden ve başlattığınızdan emin olun ve kullanımını inceleyin.- Verilen her
gcloudkomutundaPROJECT_IDdeğerini girmek istemiyorsanız Cloud projenizigcloud config set projectPROJECT_IDile ayarlayın. - Örnek uygulamayı
gcloud app deployile dağıtma - 1. Modül uygulamasının, en son ziyaretleri gösterirken sorunsuz bir şekilde beklendiği gibi çalıştığını onaylayın (aşağıda gösterilmiştir).

4. Yapılandırmayı güncelleyin
Standart App Engine yapılandırma dosyalarında (app.yaml, requirements.txt, appengine_config.py) herhangi bir değişiklik yapılması gerekmez.
5. Uygulama dosyalarını değiştirme
Birincil uygulama dosyası main.py'dır ve bu bölümdeki tüm güncellemeler bu dosyayla ilgilidir. Web şablonunda da küçük bir güncelleme yapıldı: templates/index.html. Bu bölümde uygulanacak değişiklikler şunlardır:
- İçe aktarma işlemlerini güncelleme
- Push görevi ekleme
- Görev işleyici ekleme
- Web şablonunu güncelleme
1. İçe aktarma işlemlerini güncelleme
google.appengine.api.taskqueue içe aktarıldığında Görev Sırası işlevselliği sağlanır. Bazı Python standart kitaplık paketleri de gereklidir:
- En eski ziyaretleri silme görevi eklediğimiz için uygulamanın zaman damgalarıyla ilgilenmesi, yani
timevedatetimekullanması gerekecek. - Görev yürütmeyle ilgili faydalı bilgileri kaydetmek için
logginggerekir.
Bu içe aktarmaların tümünü eklediğinizde kodunuzun bu değişikliklerden önce ve sonraki hali aşağıdaki gibi görünür:
ÖNCESİ:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
SONRASI:
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
2. Push görevi ekleme (görev için verileri harmanlama, yeni görevi sıraya alma)
Push sırası dokümanlarında şu ifade yer alır: "Bir görevi işlemek için push sırasına eklemeniz gerekir. 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. İsterseniz diğer sıraları oluşturup yapılandırmanıza gerek kalmadan tüm görevlerinizi varsayılan sıraya ekleyebilirsiniz." Bu codelab'de kısa olması için default sırası kullanılır. Aynı veya farklı özelliklere sahip kendi anlık bildirim sıralarınızı tanımlama hakkında daha fazla bilgi edinmek için Anlık Bildirim Sırası Oluşturma dokümanına bakın.
Bu codelab'in temel amacı, artık gösterilmeyen eski ziyaretleri veri deposundan silmekle görevli bir görevi (default push sırasına) eklemektir. Temel uygulama, yeni bir Visit öğesi oluşturarak her ziyareti (GET isteği /) kaydeder, ardından en son ziyaretleri getirip görüntüler. En eski ziyaretlerin hiçbiri bir daha gösterilmez veya kullanılmaz. Bu nedenle, push görevi gösterilen en eski ziyaretten daha eski olan tüm ziyaretleri siler. Bunu yapmak için uygulamanın davranışında biraz değişiklik yapılması gerekir:
- En son ziyaretler sorgulanırken bu ziyaretleri hemen döndürmek yerine uygulamayı, en eski gösterilen ziyaret olan son
Visitziyaretinin zaman damgasını kaydedecek şekilde değiştirin. Bundan daha eski tüm ziyaretleri silebilirsiniz. - Bu zaman damgasını yük olarak içeren bir push görevi oluşturun ve bu görevi, HTTP
POSTile/trimüzerinden erişilebilen görev işleyiciye yönlendirin. Özellikle, Datastore zaman damgasını dönüştürmek ve göreve göndermek (kayan nokta olarak) için standart Python yardımcı programlarını kullanın. Ayrıca, zaman damgasını (dize olarak) günlüğe kaydedin ve kullanıcıya göstermek için bu dizeyi sentinel değeri olarak döndürün.
Tüm bunlar fetch_visits() içinde gerçekleşir. Bu güncellemeler yapılmadan önce ve yapıldıktan sonraki görünüm aşağıdaki gibidir:
ÖNCESİ:
def fetch_visits(limit):
return (v.to_dict() for v in Visit.query().order(
-Visit.timestamp).fetch(limit))
SONRASI:
def fetch_visits(limit):
'get most recent visits and 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 (v.to_dict() for v in data), oldest_str
3. Görev işleyici ekleme (görev çalıştırıldığında çağrılan kod)
Eski ziyaretlerin silinmesi fetch_visits()'da kolayca yapılabilse de bu işlevin son kullanıcıyla pek ilgisi olmadığını unutmayın. Yardımcı bir işlevdir ve standart uygulama isteklerinin dışında eşzamansız olarak işlenmeye uygundur. Datastore'da daha az bilgi olacağından son kullanıcı, daha hızlı sorgulardan yararlanır. trim() adlı yeni bir işlev oluşturun. Bu işlev, /trim'ye gönderilen bir görev sırası POST isteğiyle çağrılır ve şunları yapar:
- "En eski ziyaret" zaman damgası yükünü ayıklar.
- Bu zaman damgasından daha eski tüm öğeleri bulmak için bir Datastore sorgusu yayınlar.
- Gerçek kullanıcı verilerine gerek olmadığından daha hızlı bir "yalnızca anahtarlar" sorgusunu tercih eder.
- Silinecek öğe sayısını (sıfır dahil) günlüğe kaydeder.
- Varlıkları silmek için
ndb.delete_multi()çağrıları (varsa atlanır). - Boş bir dize (örtülü bir HTTP 200 dönüş koduyla birlikte) döndürür.
Tüm bunları aşağıdaki trim() bölümünde görebilirsiniz. fetch_visits() kelimesinden hemen sonra main.py kelimesini ekleyin:
@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
4. Web şablonunu güncelleme
Web şablonunu, templates/index.html, bu Jinja2 koşullu ifadesiyle güncelleyerek değişken varsa en eski zaman damgasını gösterecek şekilde ayarlayın:
{% if oldest is defined %}
<b>Deleting visits older than:</b> {{ oldest }}</p>
{% endif %}
Şablonunuzun aşağıdaki gibi görünmesi için bu snippet'i gösterilen ziyaretler listesinden sonra ancak body kapatılmadan önce ekleyin:
<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>
<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>
{% if oldest is defined %}
<b>Deleting visits older than:</b> {{ oldest }}</p>
{% endif %}
</body>
</html>
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
Uygulamayı gcloud app deploy ile dağıtın. Çıkış, silinecek ziyaretleri gösteren en alttaki yeni satır dışında 1. Modül uygulamasının çıkışıyla aynı olmalıdır:

Codelab'i tamamladığınız için tebrik ederiz. Kodunuz artık Module 7 repo folder (7. Modül depo klasörü) içeriğiyle eşleşmelidir. Artık 8. modülde Cloud Tasks'e geçiş yapmaya hazırsınız.
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/imagesconsole.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com- Yukarıdaki depolama bağlantıları,
PROJECT_IDve *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:
- App Engine Görev Kuyruğu hizmeti, Görev Kuyruğu gibi eski paketlenmiş hizmetlerin fiyatlandırma sayfasında belirtildiği gibi ek faturalandırmaya tabi değildir.
- App Engine Datastore hizmeti, ücretsiz katmanı da olan Cloud Datastore (Datastore modunda Cloud Firestore) tarafından sağlanır. Daha fazla bilgi için fiyatlandırma sayfasına bakın.
Sonraki adımlar
Bu "taşıma" işleminde, 1. Modül örnek uygulamasına Task Queue push sırası kullanımını ekleyerek ziyaretçileri izleme desteği sağladınız ve 7. Modül örnek uygulamasını oluşturdunuz. Sonraki taşıma işleminde, isterseniz App Engine push görevlerinden Cloud Tasks'e nasıl yükselteceğiniz açıklanmaktadır. 2021 Sonbaharı itibarıyla, Python 3'e yükseltirken kullanıcıların Cloud Tasks'e geçmesi gerekmemektedir. Bu konu hakkında daha fazla bilgiyi sonraki bölümde bulabilirsiniz.
Cloud Tasks'e geçmek istiyorsanız bir sonraki adım 8. Modül'deki codelab'dir. Bunların dışında Cloud Datastore, Cloud Memorystore, Cloud Storage veya Cloud Pub/Sub (çekme sıraları) gibi ek geçişler de göz önünde bulundurulmalıdır. Cloud Run ve Cloud Functions'a ürünler arası geçişler de vardır. Tüm Serverless Migration Station içeriklerine (codelab'ler, videolar, kaynak kodu [varsa]) açık kaynak deposundan erişilebilir.
7. Python 3'e taşıma
2021 sonbaharında App Engine ekibi, paketlenmiş hizmetlerin çoğunun desteğini 2. nesil çalışma zamanlarına genişletti (başlangıçta yalnızca 1. nesil çalışma zamanlarında kullanılabiliyordu). Bu sayede, uygulamanızı Python 3'e taşırken App Engine Task Queue gibi paketlenmiş hizmetlerden bağımsız Cloud veya üçüncü taraf eşdeğerlerine (ör. Cloud Tasks) taşımanız gerekmez. Başka bir deyişle, kodu paketlenmiş hizmetlere yeni nesil çalışma zamanlarından erişecek şekilde uyarladığınız sürece Python 3 App Engine uygulamalarında Görev Sırası'nı kullanmaya devam edebilirsiniz.
Paketlenmiş hizmet kullanımını Python 3'e taşıma hakkında daha fazla bilgiyi 17. modül codelab'inde ve ilgili videoda bulabilirsiniz. Bu konu 7. Modül'ün kapsamı dışında olsa da aşağıda, Python 3'e taşınan ve App Engine NDB ile Görev Sırası'nı kullanmaya devam eden 1. ve 7. Modül uygulamalarının Python 3 sürümleri bağlantılı olarak verilmiştir.
8. 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 ile 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ı
2. Modül (BAŞLANGIÇ) ve 7. Modül (BİTİŞ) için depo klasörlerinin bağlantılarını aşağıdaki tabloda bulabilirsiniz.
Codelab | Python 2 | Python 3 |
kod (bu eğitimde yer almaz) | ||
7. Modül (bu codelab) | kod (bu eğitimde yer almaz) |
Online kaynaklar
Bu eğitimle ilgili olabilecek online kaynakları aşağıda bulabilirsiniz:
App Engine görev sırası
- App Engine görev sırasına genel bakış
- App Engine Görev Sırası push sıralarına genel bakış
- Task Queue push sıraları oluşturma
queue.yamlreferansqueue.yamlve Cloud Tasks karşılaştırması- Push sıralarını Cloud Tasks'a taşıma rehberi
- App Engine görev sırası push sıralarını Cloud Tasks'e taşıma dokümanı örneği
App Engine platformu
- App Engine belgeleri
- Python 2 App Engine (standart ortam) çalışma zamanı
- Python 2 App Engine'de App Engine'in yerleşik kitaplıklarını kullanma
- Python 3 App Engine (standart ortam) çalışma zamanı
- Python 2 ve 3 App Engine (standart ortam) çalışma zamanları arasındaki farklar
- Python 2'den 3'e App Engine (standart ortam) taşıma kılavuzu
- App Engine fiyatlandırma ve kota bilgileri
- İkinci nesil App Engine platformunun kullanıma sunulması (2018)
- Birinci ve ikinci nesil platformları karşılaştırma
- Eski çalışma zamanları için uzun süreli destek
- Doküman taşıma örnekleri
- Topluluk tarafından gönderilen geçiş örnekleri
Diğer Cloud bilgileri
- Google Cloud Platform'da Python
- Google Cloud Python istemci kitaplıkları
- Google Cloud "Her Zaman Ücretsiz" katmanı
- Google Cloud SDK (
gcloudkomut satırı aracı) - Tüm Google Cloud belgeleri
Videolar
- Sunucusuz Taşıma İstasyonu
- Sunucusuz Expeditions
- Google Cloud Tech kanalına 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.