1. Genel Bakış
Bu codelab serisi (kendi hızınızda ilerleyebileceğiniz, uygulamalı eğitimler), bir dizi taşıma işlemi boyunca yol göstererek Google App Engine (Standart) geliştiricilerinin uygulamalarını modernleştirmelerine yardımcı olmayı amaçlar. Bu tür taşıma işlemlerinin çoğunda, yeni nesil çalışma zamanları daha esnek olduğundan ve kullanıcılara daha fazla hizmet seçeneği sunduğundan orijinal çalışma zamanı paketli hizmetlerden uzaklaşılır. Uygulamaları modernleştirmenin bir başka yolu da daha yeni bir ürüne yükseltmektir. Bu codelab'in konusu da budur.
Datastore'a Cloud NDB veya Cloud Datastore istemci kitaplıklarıyla erişen App Engine kullanıcıları, başka bir taşıma işlemi yapmalarına gerek kalmadan kullanmaya devam edebilir. Ancak Cloud Firestore, Firebase Realtime Database'in özelliklerini içeren en yeni, ölçeklenebilir ve yüksek düzeyde kullanılabilir NoSQL veri deposunu temsil eder.
Özelliklerinden yararlanmak için Firestore'u kullanmak zorunda olduğunu düşünen veya en azından geçişin ne gerektirdiğini keşfetmeye yetecek kadar ilgi duyan bir geliştiriciyseniz doğru yerdesiniz. Bu eğiticide, Cloud Datastore'u kullanan bir App Engine uygulamasını Cloud Firestore'a nasıl taşıyacağınız açıklanmaktadır.
Öğrenecekleriniz
- Datastore ile Firestore arasındaki farkları tanıma
- Cloud Datastore'dan Cloud Firestore'a geçiş
Gerekenler
- Aşağıdakileri içeren bir Google Cloud Platform 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
- Bu codelab'e (Modül 6) başlamadan önce Modül 3 codelab'ini tamamlamanız ve Python 3'e taşımanız önerilir.
- Çalışan bir 3. Modül Cloud Datastore Python 3 App Engine uygulaması.
Anket
Bu codelab'i nasıl kullanacaksınız?
2. Arka plan
App Engine'in Datastore'u 2013'te kendi ürünü olan Google Cloud Datastore'a dönüştü ve artık App Engine dışındaki geliştiriciler tarafından da kullanılabiliyor. Firebase, ertesi yıl Google tarafından satın alındı. O dönemde gerçek zamanlı veritabanıyla tanınıyordu.
Firebase ve Cloud Datastore ekipleri, sonraki birkaç yıl boyunca Firebase özelliklerinden bazılarını Datastore'a entegre etmek için çalıştı. Sonuç olarak, 2017'de yeni nesil Cloud Datastore yayınlandı. Bazı Firebase özelliklerinin devralınmasını yansıtmak için Cloud Firestore olarak yeniden markalandırıldı.
Cloud Firestore, Google Cloud projeleri için varsayılan NoSQL depolama mekanizması oldu. Yeni uygulamalar Cloud Firestore'u yerel olarak kullanabilir. Mevcut Datastore veritabanları ise arka planda Firestore'a dönüştürülmüş ve Datastore işlemleriyle uyumluluğu korumak için artık "Datastore modunda Firestore" olarak çalışmaktadır. Sonuç olarak, uygulamalar Cloud Firestore'u yalnızca bu modlardan birinde çalıştırabilir ve ayarlandıktan sonra değiştirilemez.
Şu anda kullanıcılar yeni projeler oluşturup NoSQL çözümü seçtiklerinde Datastore modunda Firestore veya Native mode'da Firestore'u seçmeleri istenir. Kullanıcılar Datastore varlıkları ekledikten sonra Firestore'a geçemez. Benzer şekilde, Firestore yerel modu seçildikten sonra Datastore'a (veya Datastore modunda Firestore'a) geri dönemezler. Daha fazla bilgi için dokümanlardaki Datastore modunda Cloud Firestore veya yerel Firestore modu arasında seçim yapma sayfasını inceleyin. Bir uygulamayı Firestore'a taşımak için yeni bir proje oluşturulmalı, Datastore dışa aktarılmalı ve ardından Firestore'a aktarılmalıdır. Bu eğitimin amacı, geliştiricilere Cloud Datastore ve Cloud Firestore kullanma arasındaki farklar hakkında fikir vermektir.
Bu taşıma, kullanıcıların yapmasını beklediğimiz bir taşıma değildir. Bu nedenle, isteğe bağlı bir taşıma işlemidir. Cloud Firestore'u yerel olarak kullanmanın istemci kimlik doğrulaması, Firebase kuralları entegrasyonu ve elbette Firebase anlık veritabanı gibi bariz avantajları olsa da taşıma adımları "zahmetlidir":
- Mevcut uygulamanızın projesinden farklı bir proje kullanmanız gerekir.
- Bir uygulamanın Datastore varlıkları eklediği projeler, yerel modda Firestore'a geçirilemez.
- Benzer şekilde, yerel modda Firestore'u seçmiş bir proje, Datastore modunda Firestore'a geri dönemez.
- Verileri bir projeden diğerine aktarabilecek bir taşıma aracı yoktur.
- Ad alanları ve daha yüksek yazma işleme hızı (>10 bin/sn) gibi bazı kritik Datastore özellikleri Firestore'da kullanılamaz.
- Dışa aktarma ve içe aktarma araçları "basit" ve "ya hep ya hiç" senaryolarıdır.
- Uygulamanızda çok sayıda Datastore varlığı varsa bunların dışa aktarılması ve Firestore'a aktarılması uzun saatler sürebilir.
- Bu süre zarfında uygulamanız/hizmetiniz veri yazamaz/güncelleyemez.
- Taşıma etkinlikleri normal kullanım kapsamında değerlendirilir. Maliyetleri en aza indirmek için bu etkinlikleri (mümkünse günlük kotalar dahilinde) yayabilirsiniz.
- Yeni hizmetiniz farklı bir projede çalıştığı için DNS güncellemelerinin yayılması için bir süre beklemeniz gerekir.
- Datastore ve Firestore'un benzer ancak farklı veri modelleri vardır. Bu nedenle, taşıma işlemi için uygulamanın/hizmetin çalışma şeklinin güncellenmesi gerekir.
- Datastore'daki üst öğe sorguları artık Firestore koleksiyon sorgularıdır (varsayılan).
- Datastore'daki geniş tür sorgular, Firestore koleksiyon grubu sorgularıdır.
- İndeksler ve işleme farklıdır.
Bununla birlikte, taşımayı düşündüğünüz oldukça basit bir uygulamanız varsa, böyle bir taşımayı simüle etmeye hazırlanıyorsanız veya yalnızca Datastore ile Firestore arasındaki farkları öğrenmek için buradaysanız lütfen devam edin.
Python 2 kullanıcıları: Bu isteğe bağlı taşıma codelab'i yalnızca Python 3'te sunulur. Ancak Cloud Firestore 2.x'i de desteklediğinden kullanıcılar kullanım farklılıklarını tahmin edebilir. Örneğin, Firestore kayıtlarında Unicode dizeler (bayt dizeleri yerine) kullanılır. Bu nedenle, Python 2 dize değişmezleri için u'' önde gelen göstergesi gerekir. Yani 2.x store_visit() işlevi şu şekilde görünür:
def store_visit(remote_addr, user_agent):
doc_ref = fs_client.collection(u'Visit')
doc_ref.add({
u'timestamp': datetime.now(),
u'visitor': u'{}: {}'.format(remote_addr, user_agent),
})
Bunun dışında, istemci kitaplığı benzer şekilde çalışır. Dikkate alınması gereken tek diğer sorun, 2.x Cloud Firestore kitaplığının geliştirme açısından "dondurulmuş" olmasıdır. Bu nedenle, giderek daha fazla/yeni özellik yalnızca 3.x Firestore istemci kitaplığında kullanılabilecektir.
Bu taşıma işlemine devam ederken bu eğitimin temel adımları şunlardır:
- Kurulum/Ön Hazırlık
- Cloud Firestore kitaplığını ekleme
- Uygulama dosyalarını güncelleme
3. Kurulum/Ön Hazırlık
Eğitimin ana bölümüne başlamadan önce projemizi oluşturalım, kodu alalım ve temel uygulamayı dağıtalım. Böylece, çalışır durumda olan bir kodla başladığımızı biliriz.
1. Proje oluşturma
3. Modül codelab'ini tamamlarken kullandığınız projeyi tekrar 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 (uygulama) etkinleştirildiğinden emin olun.
2. Temel örnek uygulamayı edinme
Bu codelab'in ön koşullarından biri, çalışan bir 3. Modül örnek uygulamasına sahip olmaktır. Çalışan bir örnek uygulamanız yoksa buraya geçmeden önce 3. Modül eğitimini (yukarıdaki bağlantı) tamamlayın. Aksi takdirde, içeriği biliyorsanız aşağıdaki 3. Modül kodunu alarak başlayabilirsiniz.
Sizinkini veya bizimkini kullanmanız fark etmez. 3. Modül kodunu KULLANMAYA BAŞLAYACAĞIZ. Bu 6. Modül kod laboratuvarı, her adımda size yol gösterir ve tamamlandığında FINISH noktasındaki koda benzer. (Bu eğitim yalnızca Python 3 için kullanılabilir.)
- BAŞLANGIÇ: Module 3 repo (3. Modül deposu)
- BİTİRME: Module 6 repo
- Tüm depo (klonlama veya ZIP olarak indirme)
3. Modül dosyalarının dizini (sizinki veya bizimkisi) şu şekilde görünmelidir:
$ ls
README.md main.py templates
app.yaml requirements.txt
3. 3. Modül uygulamasını (yeniden) dağıtma
Şimdi yapmanız gereken kalan ön hazırlık adımları:
- Gerekirse
gcloudkomut satırı aracıyla ilgili bilgilerinizi tazeleyin. - 3. Modül kodunu App Engine'e (yeniden) dağıtın (gerekirse).
Bu adımları başarıyla uygulayıp çalışır durumda olduğunu onayladıktan sonra, yapılandırma dosyalarıyla başlayarak bu eğitimde ilerleyeceğiz.
Python 2 gereksinimleri
app.yaml'nın (hâlâ) üçüncü taraf paketlerini (grpciovesetuptools) referans aldığından emin olun.appengine_config.py, uygulamayı üçüncü taraf kaynaklarına yönlendirmek içinpkg_resourcesvegoogle.appengine.ext.vendorkullanmaya devam etmelidir.- Bir sonraki bölümde (
requirements.txtgüncelleme), Python Firestore istemci kitaplığının 2.x ile uyumlu son sürümü olduğundangoogle-cloud-firestore==1.9.0kullanmanız gerekir.requirements.txtdosyanızdagoogle-cloud-coreiçin bir giriş varsa olduğu gibi bırakın.libuygulamasını silippip install -t lib -r requirements.txtile yeniden yükleyin.
4. Yapılandırma dosyalarını güncelleme (Cloud Firestore kitaplığını ekleme)
Kurulumun ardından, yapılandırmayı ve uygulama dosyalarını güncellemeniz gerekir. İlk durumda, tek yapılandırma değişikliği requirements.txt dosyanızda küçük bir paket değişimi olduğundan bunu şimdi yapalım.
google-cloud-datastore satırını requirements.txt içinde google-cloud-firestore ile değiştirerek aşağıdaki gibi görünmesini sağlayın:
Flask==1.1.2
google-cloud-firestore==2.0.2
Her kitaplığın en son sürümünü kullanmanızı öneririz. Yukarıdaki sürüm numaraları, bu yazı yazıldığı sırada en son sürümlerdir. FINISH repo klasöründeki kod daha sık güncellenir ve daha yeni bir sürümü olabilir.
Başka yapılandırma değişikliği olmadığından app.yaml ve templates/index.html olduğu gibi kalır.
5. Uygulama dosyalarını güncelleme
Yalnızca bir uygulama dosyası (main.py) olduğundan bu bölümdeki tüm değişiklikler yalnızca bu dosyayı etkiler.
1. İçe aktarılanlar
Paket içe aktarma işlemini datastore'dan firestore'a geçirmek küçük bir değişikliktir:
- ÖNCESİ:
from google.cloud import datastore
- ŞU TARİHTEN SONRA:
from google.cloud import firestore
2. Firestore erişimi
Flask'ı başlattıktan sonra Firestore istemcinizi oluşturun. Yukarıdakine benzer bir değişiklik yapın ancak bu kez istemci başlatma için:
- ÖNCESİ:
app = Flask(__name__)
ds_client = datastore.Client()
- ŞU TARİHTEN SONRA:
app = Flask(__name__)
fs_client = firestore.Client()
Cloud NDB'den Cloud Datastore'a geçiş yaparak Cloud Firestore'a ulaşmak için gereken önemli adımları zaten tamamladınız. Datastore ile ortak Özelliklerden oluşan Varlıklar şeklinde veri kayıtları oluşturur ve bunları Anahtarlara göre gruplandırırsınız. Firestore'daki veri kayıtları, anahtar/değer çiftlerinden oluşan ve Koleksiyonlar halinde gruplandırılmış Belgelerdir. Datastore'dan geçiş yaparken bu farklılıkları göz önünde bulundurmanız gerekir. Çünkü bu farklılıklar, veri kayıtları oluştururken ve bu kayıtlar için sorgu oluştururken ortaya çıkar. Sonuçlarınız, Datastore kodunuzun karmaşıklığına bağlı olarak değişiklik gösterebilir.
Datastore'da filtreleme ve sıralama ölçütleriyle birlikte Varlık türüne göre sorgular oluşturursunuz. Firestore'da veri sorgulama da benzerdir. Şu sorgu değerleri, istemciler (sırasıyla ds_client veya fs_client) ve içe aktarmalar olduğunu varsayarak kısa bir örneğe göz atalım:
from datetime import datetime
from firestore.Query import DESCENDING
OCT1 = datetime(2020, 10, 1)
LIMIT = 10
Datastore için 1 Ekim 2020'den yeni olan en son 10 Visit öğeyi azalan düzende sorgulayalım:
query = ds_client.query(kind='Visit')
query.add_filter('timestamp', '>=', datetime(2020, 10, 1))
query.order = ['-timestamp']
return query.fetch(limit=LIMIT)
Aynı işlemi Firestore için Visit koleksiyonundan yapın:
query = fs_client.collection('Visit')
query.where('timestamp', '>=', datetime(2020, 10, 1))
query.order_by('timestamp', direction=DESCENDING)
return query.limit(LIMIT).stream()
Örnek uygulama sorgusu daha basittir ("WHERE" ifadesi yoktur). İnceleme için Cloud Datastore kodunu aşağıda bulabilirsiniz:
- ÖNCESİ:
def store_visit(remote_addr, user_agent):
entity = datastore.Entity(key=ds_client.key('Visit'))
entity.update({
'timestamp': datetime.now(),
'visitor': '{}: {}'.format(remote_addr, user_agent),
})
ds_client.put(entity)
def fetch_visits(limit):
query = ds_client.query(kind='Visit')
query.order = ['-timestamp']
return query.fetch(limit=limit)
Firestore'a geçiş yaptığınızda yeni dokümanlar oluşturmanın varlık oluşturmaya, sorguların ise daha önce gösterildiği gibi olduğunu göreceksiniz.
- ŞU TARİHTEN SONRA:
def store_visit(remote_addr, user_agent):
doc_ref = fs_client.collection('Visit')
doc_ref.add({
'timestamp': datetime.now(),
'visitor': '{}: {}'.format(remote_addr, user_agent),
})
def fetch_visits(limit):
visits_ref = fs_client.collection('Visit')
visits = (v.to_dict() for v in visits_ref.order_by('timestamp',
direction=firestore.Query.DESCENDING).limit(limit).stream())
return visits
root() ana işlevi ve index.html şablon dosyası aynı kalır. Değişikliklerinizi iki kez kontrol edin, kaydedin, dağıtın ve doğrulayın.
6. Özet/Temizleme
Uygulamayı dağıtma
Uygulamanızı gcloud app deploy ile yeniden dağıtın ve uygulamanın çalıştığını onaylayın. Kodunuz artık 6. modül deposundaki kodla (veya tercihiniz buysa 2.x sürümüyle) eşleşmelidir.
Bu seriye önceki codelab'lerden herhangi birini yapmadan başladıysanız uygulamanın kendisi değişmez. Ana web sayfasını (/) tüm ziyaretleri kaydeder ve siteyi yeterince ziyaret ettiğinizde aşağıdaki gibi görünür:

İsteğe bağlı olan bu 6. modül taşıma işlemini tamamladığınız için tebrik ederiz. Bu, App Engine veri depolama alanı açısından yapabileceğiniz son taşıma işlemlerinden biri olabilir. Dikkate alabileceğiniz alternatif bir taşıma yöntemi, henüz yapmadıysanız uygulamanızı Cloud Run için kapsüllemektir (aşağıda bağlantıları verilen 4. ve 5. modüllere göz atın).
İsteğe bağlı: Temizleme
Bir sonraki taşıma codelab'ine geçmeye hazır olana kadar faturalandırılmamak için temizlik yapma konusunda ne yapmalısınız? Mevcut geliştiriciler olarak App Engine'in fiyatlandırma bilgileri hakkında bilgi sahibi olabilirsiniz.
İsteğe bağlı: Uygulamayı devre dışı bırakma
Henüz bir sonraki eğitime geçmeye hazır değilseniz ücretlendirilmemek için uygulamanızı devre dışı bırakın. Bir sonraki codelab'e geçmeye hazır olduğunuzda yeniden etkinleştirebilirsiniz. Uygulamanız devre dışıyken ücretlendirmeye neden olacak trafik almaz. Ancak ücretsiz kota aşılırsa Firestore kullanımınız için de faturalandırılabilirsiniz. Bu nedenle, bu sınırın altında kalmak için yeterli sayıda öğe silin.
Diğer yandan, taşımalara devam etmeyecekseniz ve her şeyi tamamen silmek istiyorsanız projenizi kapatabilirsiniz.
Sonraki adımlar
Bu eğitimin dışında, göz önünde bulundurabileceğiniz başka taşıma modülü codelab'leri de vardır:
- 7. Modül: App Engine Push Görev Sıraları ([push] görev sıralarını kullanıyorsanız gereklidir)
- 1. modül uygulamasına App Engine
taskqueuepush görevleri ekler. - 8. modülde kullanıcıları Cloud Tasks'a geçişe hazırlar.
- 1. modül uygulamasına App Engine
- 4. Modül: Docker ile Cloud Run'a taşıma
- Uygulamanızı Docker ile Cloud Run'da çalışacak şekilde container'a dönüştürme
- Bu taşıma işlemi, Python 2'de kalmanıza olanak tanır.
- 5. Modül: Cloud Buildpack'ler ile Cloud Run'a taşıma
- Cloud Buildpacks ile Cloud Run'da çalışacak şekilde uygulamanızı container'a dönüştürme
- Docker, container'lar veya
Dockerfile'ler hakkında hiçbir şey bilmeniz gerekmez. - Uygulamanızın Python 3'e taşınmış olması gerekir (Buildpacks, Python 2'yi desteklemez).
7. Ek kaynaklar
App Engine taşıma modülüyle ilgili codelab sorunları/geri bildirimleri
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ı
Modül 3 (BAŞLANGIÇ) ve Modül 6 (BİTİŞ) ile ilgili depo klasörlerinin bağlantılarını aşağıdaki tabloda bulabilirsiniz. Ayrıca, tüm App Engine geçişleri için kullanılan depodan da erişilebilir. Bu depoyu klonlayabilir veya ZIP dosyası olarak indirebilirsiniz.
Codelab | Python 2 | Python 3 |
(kod) | ||
Modül 6 | (yok) |
App Engine kaynakları
Bu özel taşıma işlemiyle ilgili ek kaynakları aşağıda bulabilirsiniz:
- Python Cloud Datastore ve Cloud Firestore referansları
- Python 3'e ve GAE yeni nesil çalışma zamanına taşıma
- Genel