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

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'de, 1. Modül codelab'inden örnek uygulamada App Engine Görev Sırası aktarma görevlerinin nasıl kullanılacağı açıklanmaktadır. 7. Modül blog yayını ve videosu bu eğiticideki içeriği tamamlayıcı niteliktedir ve bu eğitimdeki içeriğe kısa bir genel bakış sağlar.

Bu modülde, push görevlerinin kullanımını ekleyeceğiz, ardından bu kullanımı Modül 8'de Cloud Tasks'a ve üzeriden Python 3'e ve Modül 9'da Cloud Datastore'a taşıyacağız. pull görevleri için Görev Sıraları'nı kullananlar, Cloud Pub/Sub'a taşınacaktır ve bunun yerine 18-19 arasındaki Modüllere başvurmaları gerekir.

Demoda aşağıdaki işlemleri yapmayı öğreneceksiniz:

  • App Engine Task Queue API'yi/paketlenmiş hizmeti kullanma
  • Temel Python 2 Flask App Engine NDB uygulamasına aktarma görevi kullanımı ekleme

Gerekenler

Anket

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

Yalnızca okuma 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 ekibi, 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ı öneriyor.

Push görevi taşıma işlemi 18-19 arasındaki Taşıma Modülleri'nde, Modül 7-9'da ise push görevi taşımaya odaklanılır. App Engine Görev Sırası aktarma görevlerinden geçiş yapmak için bu görevlerin kullanımını Modül 1 codelab'den elde edilen mevcut Flask ve App Engine NDB uygulamasına ekleyin. Söz konusu uygulamada, yeni bir sayfa görünümü yeni bir Ziyaret kaydeder ve kullanıcıya yapılan en son ziyaretleri gösterir. Eski ziyaretler bir daha asla gösterilmediğinden ve Datastore'da yer kapladığından en eski ziyaretleri otomatik olarak silmek için bir aktarma görevi oluşturacağız. 8. Modül'den önce bu uygulamayı Görev Sırası'ndan Cloud Görevler'e taşıyacağız.

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

Bu adımlar, çalışan bir kodla başlamanızı sağlar.

1. Proje oluşturun

Modül 1 codelab'ini tamamladıysanız aynı projeyi (ve kodu) yeniden kullanmanızı öneririz. Alternatif olarak, yeni bir proje oluşturabilir veya mevcut başka bir projeyi yeniden kullanabilirsiniz. Projenin etkin bir faturalandırma hesabı olduğundan ve App Engine'in etkin olduğundan emin olun.

2. Temel örnek uygulamayı al

Bu codelab'in ön koşullarından biri, çalışan bir Modül 1 App Engine uygulamasına sahip olmaktır: Modül 1 codelab'ini tamamlayın (önerilen) veya depodan Modül 1 uygulamasını kopyalayın. İster sizinkini ister bizimkiyi kullanın, Modül 1 kodunu "BAŞLAT" olalım. Bu codelab'de her adımda size yol gösterilir ve Modül 7 depo klasöründeki "FINISH" kod deposuna benzeyen bir kod gösterilir.

Kullandığınız Modül 1 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               main.py                 templates
app.yaml                requirements.txt

3. Temel uygulamayı (yeniden) dağıtma

Modül 1 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. Cihazınızda Python 2 ve 3 yüklüyse bunun yerine pip2 komutunu kullanmanız gerekebilir.
  2. gcloud komut satırı aracını yüklediğinizden, başlattığınızdan ve kullanımını incelediğinizden emin olun.
  3. Verilen her gcloud komutunda 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. Modül 1 uygulamasının en son ziyaretleri göstererek sorunsuz bir şekilde ç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) değişiklik yapılmasına gerek yoktur.

5. Uygulama dosyalarını değiştirme

Birincil uygulama dosyası main.py ve bu bölümdeki tüm güncellemeler söz konusu dosyayla ilgilidir. Ayrıca templates/index.html adlı web şablonunda küçük bir güncelleme yapıldı. Bunlar, bu bölümde uygulanacak değişikliklerdir:

  1. İçe aktarmaları güncelleme
  2. Push görevi ekle
  3. Görev işleyici ekle
  4. Web şablonunu güncelle

1. İçe aktarmaları güncelleme

google.appengine.api.taskqueue içe aktarıldığında Görev Sırası işlevi etkinleştirilir. Bazı Python standart kitaplık paketleri de gereklidir:

  • En eski ziyaretleri silmeye yönelik bir görev eklediğimiz için, uygulamanın zaman damgalarıyla, yani time ve datetime kullanımıyla ilgilenmesi gerekir.
  • Görevin yürütülmesiyle ilgili yararlı bilgileri günlüğe kaydetmek için logging öğesine ihtiyacımız var.

Bu içe aktarmaların tümünü eklediğinizde, kodunuzun bu değişikliklerden önce ve sonra nasıl görüneceği aşağıda verilmiştir:

ÖNCE:

from flask import Flask, render_template, request
from google.appengine.ext import ndb

SONRA:

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 birleştirme, 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, yapılandırılmış ve varsayılan ayarlarla kullanıma hazır olan default adında varsayılan bir push sırası sağlar. İsterseniz diğer sıralar oluşturup yapılandırmak zorunda kalmadan tüm görevlerinizi varsayılan sıraya ekleyebilirsiniz." Bu codelab'de, sürecin kısaltılması için default sırası kullanılır. Aynı veya farklı özelliklere sahip kendi push sıralarınızı tanımlama hakkında daha fazla bilgi edinmek için Push Sıraları Oluşturma dokümanlarına bakın.

Bu codelab'in birincil amacı, görevi artık görüntülenmeyen eski ziyaretleri Datastore'dan silmek olan bir görev (default aktarma sırasına) eklemektir. Temel uygulama, yeni bir Visit varlığı oluşturarak her ziyareti (GET isteği /) kaydeder, ardından en son ziyaretleri getirip gösterir. En eski ziyaretlerden hiçbiri tekrar gösterilmez veya kullanılmaz. Bu nedenle aktarma görevi, görüntülenen en eski ziyaretlerden daha eski olan tüm ziyaretleri siler. Bunun için uygulama davranışının biraz değişmesi gerekiyor:

  1. En son ziyaretleri sorgularken bu ziyaretleri hemen geri getirmek yerine, görüntülenen en eski Visit zaman damgasını kaydetmek için uygulamayı değiştirin. Bundan daha eski tüm ziyaretler güvenle silinebilir.
  2. Yük olarak bu zaman damgasını kullanan bir aktarma görevi oluşturun ve onu, /trim adresine HTTP POST üzerinden erişilebilen görev işleyiciye yönlendirin. Spesifik olarak, Datastore zaman damgasını dönüştürmek ve göreve göndermek (kayan noktalı olarak) ve aynı zamanda günlüğe kaydetmek (dize olarak) ve dizeyi kullanıcıya göstermek için koruyucu değeri olarak döndürmek için standart Python yardımcı programlarını kullanın.

Tüm bu işlemler fetch_visits() içinde gerçekleşir ve bu güncellemeler yapılmadan önce ve yapıldıktan sonra şu şekilde görünür:

ÖNCE:

def fetch_visits(limit):
    return (v.to_dict() for v in Visit.query().order(
            -Visit.timestamp).fetch(limit))

SONRA:

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 (görev çalışırken çağrılan kod) ekle

Eski ziyaretler fetch_visits() üzerinden kolayca silinebilir, ancak bu işlevin son kullanıcı ile pek bir ilgisi olmadığını unutmayın. Yardımcı işlevlere sahiptir ve standart uygulama isteklerinin dışında eşzamansız olarak işlenmeleri için iyi bir adaydır. Son kullanıcı, Datastore'da daha az bilgi olacağından daha hızlı sorguların avantajından yararlanacaktır. /trim için yapılacak, Görev Sırası POST isteği aracılığıyla çağrılan ve şunları yapan yeni bir trim() işlevi oluşturun:

  1. "En eski ziyareti" çıkarır zaman damgası yükü
  2. Bu zaman damgasından daha eski tüm varlıkları bulmak için bir Datastore sorgusu düzenler.
  3. Daha hızlı bir "yalnızca anahtarlar" seçeneği tercih edilir sorgusuna örnektir.
  4. Silinecek varlık sayısını (sıfır dahil) günlüğe kaydeder.
  5. Varlıkları silmek için ndb.delete_multi() öğesini çağırır (atlanmazsa atlanır).
  6. Boş bir dize döndürür (örtülü HTTP 200 dönüş koduyla birlikte).

Bunların tümünü aşağıdaki trim() bölümünde görebilirsiniz. fetch_visits() tarihinden hemen sonra main.py bölümüne 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üncelle

templates/index.html web şablonunu, en eski zaman damgasını (varsa) göstermesi için bu Jinja2 koşuluyla güncelleyin:

{% 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örüntülenen ziyaret listesinden sonra, ancak gövdeyi kapatmadan ö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/Temizlik

Bu bölümde, uygulamayı dağıtıp amaçlandığı şekilde ve yansıtılan herhangi bir çıkışta çalıştığını doğrulayarak bu codelab'i özetledik. Uygulama doğrulamasından sonra tüm temizlik işlemlerini yapın ve sonraki adımları değerlendirin.

Uygulamayı dağıtma ve doğrulama

Uygulamayı gcloud app deploy ile dağıtın. Çıkış, Modül 1 uygulamasıyla aynı olmalıdır. Tek fark, en altta hangi ziyaretlerin silineceğini gösteren yeni bir satırdır:

4aa8a2cb5f527079.png

Codelab'i tamamladığınız için tebrikler. Kodunuz artık Module 7 depo klasöründeki kodla eşleşmelidir. Artık Modül 8'de Cloud Tasks'a geçiş yapmaya hazır.

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:

Sonraki adımlar

Bu "taşıma" işleminde, 1. Modül örnek uygulamasına Görev Sırası push sırası kullanımı ekleyerek ziyaretçileri izleme desteği eklendi ve 7. Modül örnek uygulaması elde edildi. Bir sonraki taşıma işleminde, App Engine push görevlerinden Cloud Tasks'a yükseltme yapmayı öğreneceksiniz. 2021 sonbaharından itibaren, Python 3'e geçiş yapan kullanıcıların Cloud Tasks'a taşınması gerekmez. Bu konuyla ilgili daha fazla bilgiyi bir sonraki bölümde bulabilirsiniz.

Cloud Tasks'a geçmek istiyorsanız Modül 8 codelab'e geçebilirsiniz. Bunun yanı sıra Cloud Datastore, Cloud Memorystore, Cloud Storage veya Cloud Pub/Sub (alıntma sıraları) gibi ek taşıma işlemleri de gerçekleştirilebilir. Ayrıca Cloud Run ve Cloud Functions'a ürünler arası taşıma işlemleri de yapılabilir. Tüm Sunucusuz Taşıma İstasyonu içeriklerine (codelab'ler, videolar, kaynak kodu [kullanılabilir olduğunda]) açık kaynak deposundan erişebilirsiniz.

7. Python 3'e taşıma

2021'in sonbaharında App Engine ekibi, paket halinde sunulan çoğu hizmetin desteğini genişleterek 2. nesil çalışma zamanlarını da sunmaya başladı (orijinal olarak yalnızca 1. nesil çalışma zamanlarında kullanılabilir). Bu sayede, uygulamanızı Python 3'e taşırken App Engine Görev Sırası gibi gruplandırılmış hizmetlerden bağımsız Cloud'a veya Cloud Tasks gibi 3. taraf eşdeğerlerine geçiş yapmanız gerekmiyor. Başka bir deyişle, yeni nesil çalışma zamanlarından paket hâlinde sunulan hizmetlere erişmek için kodu geri yüklediğiniz sürece Görev Sırası'nı Python 3 App Engine uygulamalarında kullanmaya devam edebilirsiniz.

Modül 17 codelab'de ve ilgili videoda, paketlenmiş hizmet kullanımının Python 3'e nasıl taşınacağı hakkında daha fazla bilgi edinebilirsiniz. Bu konu, Modül 7'nin kapsamı dışında olsa da, Python 3'e taşınan ve hâlâ App Engine NDB ve Görev Sırası'nı kullanan Modül 1 ve 7 uygulamalarının Python 3 sürümlerini aşağıda bulabilirsiniz.

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 2 (START) ve Modül 7 (FINISH) için depo klasörlerinin bağlantılarını aşağıdaki tabloda bulabilirsiniz.

Codelab

Python 2

Python 3

1. Modül

kod

kod (bu eğiticide ele alınmamıştır)

7. Modül (bu codelab)

kod

kod (bu eğiticide ele alınmamıştır)

Çevrimiçi kaynaklar

Aşağıda, bu eğitim için alakalı olabilecek çevrimiçi kaynaklar verilmiştir:

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.