Flask uygulamalarında App Engine Görev Sırası (push görevleri) nasıl kullanılır (Modül 7)

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

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 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:

  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

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.

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:

  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. Hem Python 2 hem de 3 yüklüyse bunun yerine pip2 komutunu 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. Verilen her gcloud komutunda 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. 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).

a7a9d2b80d706a2b.png

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:

  1. İçe aktarma işlemlerini güncelleme
  2. Push görevi ekleme
  3. Görev işleyici ekleme
  4. 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 time ve datetime kullanması gerekecek.
  • Görev yürütmeyle ilgili faydalı bilgileri kaydetmek için logging gerekir.

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:

  1. En son ziyaretler sorgulanırken bu ziyaretleri hemen döndürmek yerine uygulamayı, en eski gösterilen ziyaret olan son Visit ziyaretinin zaman damgasını kaydedecek şekilde değiştirin. Bundan daha eski tüm ziyaretleri silebilirsiniz.
  2. Bu zaman damgasını yük olarak içeren bir push görevi oluşturun ve bu görevi, HTTP POST ile /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:

  1. "En eski ziyaret" zaman damgası yükünü ayıklar.
  2. Bu zaman damgasından daha eski tüm öğeleri bulmak için bir Datastore sorgusu yayınlar.
  3. Gerçek kullanıcı verilerine gerek olmadığından daha hızlı bir "yalnızca anahtarlar" sorgusunu tercih eder.
  4. Silinecek öğe sayısını (sıfır dahil) günlüğe kaydeder.
  5. Varlıkları silmek için ndb.delete_multi() çağrıları (varsa atlanır).
  6. 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:

4aa8a2cb5f527079.png

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/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

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

1. Modül

code

kod (bu eğitimde yer almaz)

7. Modül (bu codelab)

code

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 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.