Flask uygulamalarında App Engine Memcache'i kullanma (Modül 12)

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, Modül 1 codelab'den örnek uygulamaya App Engine Memcache'i eklemeyi ve kullanmayı öğretebilirsiniz. Bu Modül 12 eğiticisine Memcache kullanımını ekleyip ardından Modül 13'te Cloud Memorystore'a geçiş yapacağız.

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

  • App Engine Memcache API'sini/kitaplığını kullanma
  • Temel Python 2 Flask App Engine NDB uygulamasına önbelleğe alma 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 Memcache'den geçiş yapmak için bu alanın kullanımını Modül 1 codelab'den elde edilen mevcut Flask ve App Engine NDB uygulamasına ekleyin. Örnek uygulama, kullanıcıya yapılan son on ziyareti gösterir. Aynı kullanıcı tarayıcısını yeniliyorsa sürekli olarak yeni Ziyaret varlıkları oluşturmak ve Datastore'dan en son ziyaretleri getirmek en uygun yöntem değildir. Bu nedenle, en son ziyaretleri önbelleğe alacağız.

Aynı ziyaretçi sayfaya gelirse, bu ziyaretler önbellekten döndürülür. Siteyi yeni bir kullanıcı ziyaret ederse veya bir saat geçerse önbellek temizlenir ve en son girişlerle değiştirilir (kayıtlı yeni bir ziyaretten söz edilmez). Bu App Engine Memcache entegrasyonu uygulandıktan sonra, bir sonraki (Modül 13) codelab'inde bunu Cloud Memorystore'a taşıyabiliriz.

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

Eğiticinin ana bölümüne geçmeden önce projemizi oluşturalım, kodu alın ve çalışan bir kodla başladığımızı öğrenmemiz için temel uygulamayı dağıtın.

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 örnek uygulamasına sahip olmaktır. AdSense hesabınız yoksa buraya geçmeden önce iki eğitimden birini (yukarıdaki bağlantılar) tamamlayın. Bu modülün içeriğine aşinaysanız aşağıdaki Modül 1 koduyla başlayabilirsiniz.

İster sizin ister bizimkininkini kullanın, Modül 1 kodunu BAŞLAyeceğiz. Bu codelab'de, Modül 11 depo klasöründeki (FINISH) koda benzeyen bir kod bulunmaktadır ve son adım her adımda size yol gösterir.

Modül 1 BAŞLANGIÇ dosyalarının dizini (sizin ya da bizimki) şöyle görünmelidir:

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

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

Hemen yürütmek için kalan ön çalışma adımlarınız:

  1. gcloud komut satırı aracını yeniden tanıma
  2. Örnek uygulamayı gcloud app deploy ile yeniden dağıtın
  3. Uygulamanın App Engine'de sorunsuz çalıştığını onaylayın

Bu adımları başarıyla uygulayıp web uygulamanızın çalıştığını (aşağıdakine benzer bir çıkışla) gördükten sonra, uygulamanıza önbelleğe alma kullanımını eklemeye hazırsınız demektir.

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

Yalnızca App Engine API eklediğimizden, harici paket yoktur. Diğer bir deyişle, herhangi bir yapılandırma dosyasının (app.yaml, requirements.txt, appengine_config.py) güncellenmesi gerekmez. Yalnızca bir uygulama dosyası (main.py) bulunduğundan bu bölümdeki tüm değişiklikler yalnızca o dosyayı etkiler.

İçe aktarılanlar

En önemli adım google.appengine.api.memcache adlı Memcache kitaplığını içe aktarmaktır. En son ziyaretleri bir saat süreyle önbelleğe alacağımızdan, saniye içindeki saniye sayısı için de bir sabit ekleyelim. Kodunuzun önceki hali ve bu değişiklik aşağıda belirtilmiştir:

ÖNCE:

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

app = Flask(__name__)

SONRA:

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

app = Flask(__name__)
HOUR = 3600

Memcache desteğiyle önbelleğe alma ekleme

En önemli değişiklik, uygulamamıza önbelleğe alma kullanımını eklemektir. Daha açık olmak gerekirse, en son ziyaretleri önbelleğe almalı, önbelleğe alınmış ziyaretlerin mevcut olup olmadığını kontrol etmeli ve planımıza göre önbelleğe alınmış sonuçları mümkün olduğunca çok kullanmaya çalışmalıyız. Uygulamanın amacımıza ulaşmak için atacağı adımlar şunlardır:

  1. Mevcut ziyareti ayarla ve visitor olarak adlandır
  2. Önbellekten en son visits öğesini getirmeye çalış
  3. Önbellek boşsa veya en son ziyaretçi (visits[0]['visitor']) mevcut visitor değerinden farklıysa: Bu son ziyareti saklayın, en son ziyaretleri getirin ve bu ziyaretleri bir saat süreyle önbelleğe alın.
  4. Web şablonu üzerinden kullanıcıya visits gösterilsin

Bu güncellemelerin öncesinde ve sonrasında yapılan değişiklikler şöyle:

ÖNCE:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)
    return render_template('index.html', visits=visits)

SONRA:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    visits = memcache.get('visits')

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0]['visitor'] != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        memcache.set('visits', visits, HOUR)  # set() not add()

    return render_template('index.html', visits=visits)

Aşağıda, yapılan değişikliklerin resimli gösterimi verilmiştir:

b1242503602f7bf0.png

Bu işlemle, App Engine memcache kullanımını Modül 1 örnek uygulamasına eklemek için gereken tüm değişiklikler tamamlanmıştır. İşe yaradığını görmek için bu uygulamayı derleyip dağıtalım.

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 temizlik adımlarını uygulayın ve sonraki adımları değerlendirin.

Uygulamayı dağıtma ve doğrulama

Uygulamanızı gcloud app deploy ile yeniden dağıtın ve uygulamanın çalıştığını onaylayın. Kodunuz artık FINISH (Modül 12 klasörü) ile eşleşmelidir. Çıkış, daha önce dağıttığınız Modül 1 uygulamasıyla aynı olmalıdır:

a7a9d2b80d706a2b.png

Tüm çalışmalarımız, aynı kullanıcı için kullanıcı deneyimini hızlandırmaktı. Alan yenilendiğinde, sonuçları doğrudan önbellekten almanız gerekir. Bu işlem, yeni ziyaret oluşturmaz veya Datastore getirme işlemi gerçekleştirmez.

Örnek uygulamamıza App Engine memcache hizmetinin kullanımını ekleyerek Modül 12 codelab'ini tamamladığınız için tebrikler. Artık bonus adımda bu Python 2 uygulamasını Python 3'e taşıyabilirsiniz.

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

Dikkate alınması gereken bir sonraki mantıksal taşıma işlemi, geliştiricilere App Engine memcache hizmetinden Cloud Memorystore'a nasıl geçiş yapılacağını gösteren Modül 13'te ele alınmıştır. Bu taşıma işlemlerinin tümü isteğe bağlıdır ve uygulamalarını modernleştirmek için çeşitli adımlar uygulamak isteyen kullanıcılar tarafından kullanılabilir. Cloud Memorystore hizmeti, birçok nedenden dolayı App Engine'in memcache sürümüne yapılan önemli bir yükseltmedir:

  • Cloud Memorystore, sunucusuz değildir. Bu, önbellek için bir sunucu ayırmanız gerektiği anlamına gelir. Cloud Memorystore'un ücretsiz katmanı da yoktur. Bu faktörlerin her ikisi de maliyeti önemli ölçüde etkileyebilir.
  • Cloud Memorystore, bir çift farklı temel depolama mekanizması (önbelleğe alma motorları), Redis ve Memcached'i destekler.
  • Cloud Memorystore (Redis için), App Engine Memcache'den çok daha zengin ve kapsamlı bir özellik grubuna sahiptir.
  • Cloud Memorystore'u kullanmak için Cloud Memorystore sunucusu kurmanız, bu sunucuyu bir Google Cloud VPC ağına eklemeniz ve ardından App Engine uygulamanızın Memorystore sunucunuzla iletişim kurmak için bu ağı kullanmasını sağlamanız gerekir.

Cloud Memorystore'un tüm özelliklerine ihtiyacınız olmadığını düşünmüyor veya maliyet üzerindeki etkilerini düşünmüyorsanız App Engine Memcache kullanmaya devam edebilirsiniz.

Modül 13'ün ötesinde, Cloud NDB ve Cloud Datastore veya Cloud Tasks gibi diğer olası taşıma işlemlerinin tümü yer alır. Ayrıca Cloud Run ve Cloud Functions'a ürünler arası taşıma işlemleri de yapılabilir. Hepsini taşıma deposunda bulabilirsiniz.

Sonraki olası bir sonraki adım, Python 3'e taşıma işlemidir. Bu işlem, isteğe bağlı bir adım olarak bir sonraki bölümde ele alınacaktır.

7. BONUS: Python 3'e geçiş

Genel Bakış

Bu bölüm, yukarıda az önce işleyeceğimiz Modül 12 uygulamasını Python 3'e taşımaya yönelik isteğe bağlı bonus içeriklerden oluşur. Yapılandırmayla başlayıp uygulama ile devam ederiz.

app.yaml'yi basitleştirin

Python 3 çalışma zamanının avantajlarından biri, app.yaml kodunun önemli ölçüde basitleştirilebilmesidir.

ÖNCE:

12. Modül'ün sonucunda app.yaml içinde neler olduğu aşağıda belirtilmiştir:

runtime: python27
threadsafe: yes
api_version: 1

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

Python 3 çalışma zamanı, kendi yönlendirmesini yapması için web çerçevelerinin kullanılmasını gerektirdiğinden app.yaml içindeki tüm rota işleyicilerin auto olarak değiştirilmesi gerekir. Statik dosya sunulmuyorsa kullanıcılar handlers: bölümünün tamamını doğrudan kaldırabilir. Ayrıca, threadsafe ve api_version desteği sonlandırıldı.

SONRA:

Az önce açıklanan gerekli değişikliklerle birlikte, Python 3'ün yerini alacak olan app.yaml aşağıda verilmiştir:

runtime: python39
app_engine_apis: true

Açıklama gerektiren tek satır: app_engine_apis: true. Eski App Engine hizmetleri 2021'de ikinci nesil çalışma zamanlarında kullanıma sunulduğunda, Python 3 gibi bazı çalışma zamanları bu API'lere erişmek için ek önyükleme gerektirir: ndb, taskqueue ve memcache. Yapılandırmadaki bu satır bu amaca hizmet eder.

Demand.txt dosyasını güncelle

requirements.txt ürününde, orijinal API'lerin başka bir önyüklemesi yapılmalıdır: Yeni App Engine SDK'sına erişim dahil edilmelidir.

ÖNCE:

12. Modül'ün sonucunda app.yaml içinde neler olduğu aşağıda belirtilmiştir:

flask

SONRA:

App Engine Python SDK'sını eklediğinizde şöyle olur:

flask
appengine-python-standard

appengine_config.py ve lib'yi sil

Yeni nesil App Engine çalışma zamanları, üçüncü taraf paket kullanımını yeniliyor:

  • Yerleşik kitaplıklar, büyük olasılıkla geliştiricilerin buluta dağıtmasına izin verilmeyen C/C++ kodunu içermeleri nedeniyle Google tarafından incelenip App Engine sunucularında kullanıma sunulanlardır. Bu kitaplıklar artık 2. nesil çalışma zamanlarında kullanılamamaktadır.
  • 2. nesil çalışma zamanlarında yerleşik olmayan kitaplıkların (bazen "tedarikçi firma" veya "kendi kendine paketleme" olarak da adlandırılır) kopyalanmasına artık gerek yoktur. Bunun yerine, derleme sistemi dağıtım sırasında bunları sizin adınıza otomatik olarak yüklediği requirements.txt konumunda listelenir.

Üçüncü taraf paket yönetiminde yapılan değişiklikler nedeniyle appengine_config.py dosyasına veya lib klasörüne ihtiyaç duyulmadığı için bunları silin. 2. nesil çalışma zamanlarında App Engine, requirements.txt konumunda listelenen üçüncü taraf paketleri otomatik olarak yükler. Özetleniyor:

  1. Gruplandırılmış veya kopyalanmış üçüncü taraf kitaplıklar olmamalıdır; requirements.txt içinde listele
  2. lib klasöründe pip install yok, yani lib klasör dönemi yok
  3. app.yaml bölgesinde yerleşik üçüncü taraf kitaplıkları listelenmez (dolayısıyla libraries bölümü yoktur); requirements.txt içinde listele
  4. Uygulamanızda referansta bulunulacak 3. taraf kitaplık olmadığında appengine_config.py dosyası olmaz

requirements.txt ürününde istenen tüm üçüncü taraf kitaplıkların listelenmesi tek geliştirici gereksinimidir.

Uygulamayı App Engine SDK'yı kullanacak şekilde güncelleyin

Yukarıda belirtildiği gibi, Python 3 uygulamalarında App Engine paket hizmetlerine erişim için bazı değişiklikler yapılması gerekir:

  1. App Engine SDK'sı paketi (requirements.txt sürümünde)
  2. App Engine SDK'sını etkinleştirin (app.yaml sürümünde)
  3. WSGI nesnesini sarmala (main.py içinde)

İlk çift yukarıda tamamlandığından, son şart main.py güncellemesinin yapılmasıdır.

ÖNCE:

Modül 12'nin sonunda yer alan Python 2 main.py aşağıda verilmiştir:

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

app = Flask(__name__)
HOUR = 3600

SONRA:

Python 3 bağlantı noktası için SDK'yı içe aktarın ve Flask uygulama nesnesini bununla (SDK sarmalayıcı) sarmalayarak şu sonuçları elde edin:

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

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600

Paket halinde sunulan hizmetlere erişmek için geliştiricilerin, 2.x'ten 3.x'e taşıma yaparken Python uygulamalarında bu değişiklikleri yapması gerekir. Flask kullanmıyorsanız Dokümanlarda Django ve Piramid örnekleri de mevcuttur. Python 2 kodunuz bir web uygulaması değilse Python 3'e taşıma işlemi için SDK paketini eklemeniz yeterli olacaktır. Uygulama kodumuz aslında Python 2 ve 3 ile çalışacak şekilde tasarlandığından, uyumluluk konusunda ek değişikliğe gerek yoktur.

Uygulamayı dağıtma

Yukarıdaki değişiklikleri tamamladıktan sonra güncellenmiş örnek uygulamayı dağıtabilirsiniz. (Uygulamanızın Python 3 sürümünü aynı GCP projesinde orijinal bir Python 2 sürümüne dağıtırken sorun yaşamazsınız.) Uygulama davranışı aynı kalmalıdır. Güncellenen uygulamanızı bizim uygulamamızla karşılaştırmanız gerekirse taşıma deposundaki Modül 12b klasörüne bakın. Python 3 gibi en yeni çalışma zamanlarında App Engine paket hizmetlerinin desteklenmesi hakkında daha fazla bilgi edinmek için özellik lansmanı duyurusunu ve Modül 17 codelab'ini inceleyin.

Tebrikler, Modül 12'deki bonus adımı tamamladınız. Python 3 çalışma zamanı için yapılandırma dosyalarını hazırlamayla ilgili belgelere de bakın. Sonraki adımlar ve temizlik için yukarıdaki Özet/Temizlik bölümünü inceleyin.

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 12 (FINISH) için depo klasörlerinin bağlantılarını aşağıdaki tabloda bulabilirsiniz. Bunlara tüm App Engine codelab taşıma işlemleri için depodan da erişilebilir. Bu depoyu klonlayabilir veya ZIP dosyası indirebilirsiniz.

Codelab

Python 2

Python 3

1. Modül

kod

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

Modül 12 (bu codelab)

kod

kod

Online referanslar

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

App Engine

Cloud Memorystore ve Cloud Datastore

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.