1. Genel Bakış
Bu codelab'lerden oluşan bu seri, Google App Engine (Standart) geliştiricilerinin bir dizi taşıma işleminde rehberlik ederek uygulamalarını modernleştirmelerine yardımcı olmayı amaçlamaktadır. Yeni nesil çalışma zamanlarının daha esnek olması ve kullanıcılara daha fazla hizmet seçeneği sunması nedeniyle bu tür taşıma işlemlerinin çoğu, çalışma zamanında paketlenmiş orijinal hizmetlerden uzaklaşmayı içerir. Uygulamaları modernleştirmenin diğer bir yolu da daha yeni bir ürüne geçmektir. Bu codelab'in konusudur.
Datastore'a Cloud NDB veya Cloud Datastore istemci kitaplıklarıyla erişen App Engine kullanıcıları kullanıma hazırdır ve daha fazla taşıma işlemi gerekmez. Öte yandan Cloud Firestore, Firebase gerçek zamanlı veritabanı özellikleri sayesinde en yeni, ölçeklenebilir, yüksek düzeyde kullanılabilir NoSQL veri deposunu temsil eder.
Özelliklerinden yararlanmak için Firestore'u kullanmak zorunda kalan veya en azından geçişin neleri kapsadığını öğrenmek için yeterli ilgiye sahip olan bir geliştiriciyseniz doğru yerdesiniz. Bu eğiticide, Cloud Datastore kullanarak bir App Engine uygulamasını Cloud Firestore'a nasıl taşıyacağınız öğretilmektedir.
Neler öğreneceksiniz?
- Datastore ve Firestore arasındaki farkları anlama
- Cloud Datastore'dan Cloud Firestore'a taşıma
Gerekenler
- Şu özelliklere sahip bir Google Cloud Platform projesi:
- Temel Python becerileri
- Yaygın Linux komutlarıyla ilgili bilgi
- App Engine uygulamalarını geliştirme ve dağıtma ile ilgili temel bilgiler
- Bu uygulamaya (Modül 6) başlamadan önce, Python 3'e taşıma da dahil olmak üzere Modül 3 codelab'ini tamamlamanız önerilir.
- Çalışan bir Modül 3 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ü olarak Google Cloud Datastore'a dönüştü ve artık App Engine'in dışındaki geliştiriciler tarafından erişilebilir. Firebase, sonraki yıl Google tarafından satın alındı. O zamanlar gerçek zamanlı veritabanıyla biliniyordu.
Sonraki birkaç yıl içinde Firebase ve Cloud Datastore ekipleri, bazı Firebase özelliklerini Datastore'a entegre etmek için çalışmalar yaptı. Bunun sonucunda 2017'de yeni nesil Cloud Datastore yayınlandı. Bazı Firebase özelliklerinin devralındığını yansıtmak için şirketin adı Cloud Firestore olarak değiştirildi.
Cloud Firestore, Google Cloud projeleri için varsayılan NoSQL depolama mekanizması haline geldi. Yeni uygulamalar Cloud Firestore'u yerel olarak kullanabilir. Bununla birlikte, mevcut Datastore veritabanları başlangıçta Firestore'a dönüştürülür ve artık "Datastore modunda Firestore" olarak çalışır Böylece Datastore işlemleriyle uyumluluğu korumak için kullanabilirsiniz. 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 bir NoSQL çözümü seçerken Datastore modunda Firestore'u veya yerel modda Firestore'u seçmeleri istenmektedir. Kullanıcılar Datastore varlıklarını ekledikten sonra Firestore olarak değiştirilemez. Benzer şekilde, Firestore yerel modu seçildikten sonra da Datastore'a (veya Datastore modunda Firestore) geri dönemezler. Daha fazla bilgi için belgelerdeki Datastore modunda Cloud Firestore veya yerel Firestore modu sayfası arasında seçim yapma bölümünü okuyun. Bir uygulamayı Firestore'a taşımak için yeni bir proje oluşturulması, Datastore'un dışa aktarılması ve ardından Firestore'a aktarılması gerekir. Bu eğiticinin amacı, geliştiricilere Cloud Datastore ile Cloud Firestore kullanımı arasındaki farklar hakkında fikir vermektir.
Bu taşıma işlemi, kullanıcıların gerçekleştirmesini beklediğimiz bir taşıma işlemi olmadığından, isteğe bağlı bir taşıma işlemidir. Cloud Firestore'u yerel olarak kullanmanın istemci kimlik doğrulaması, Firebase kuralları entegrasyonu ve tabii ki Firebase gerçek zamanlı veritabanı gibi avantajları vardır ancak taşıma adımları "kullanışsızdır":
- 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çen bir proje Datastore modunda Firestore'a geri dönemez.
- Bir projeden diğerine veri akışı gerçekleştirebilecek bir taşıma aracı yoktur.
- Ad alanları ve daha yüksek yazma işleme hızı (>10.000/sn) gibi bazı kritik Datastore özellikleri Firestore'da kullanılamaz.
- Dışa ve içe aktarma araçları "basit" "ya hep ya hiç" senaryoları ele alacağız.
- Uygulamanızda çok sayıda Datastore varlığı varsa verilerin dışa aktarıldıktan sonra Firestore'a aktarılması saatler sürebilir.
- Bu süre zarfında uygulamanız/hizmetiniz veri yazamaz/güncelleyemez.
- Taşıma etkinlikleri normal kullanıma sayılır; maliyeti en aza indirmek için bu bütçeyi (mümkünse günlük kotalara) yaymak isteyebilirsiniz.
- Yeni hizmetiniz farklı bir projede çalıştığından DNS güncellemelerinin yayılması için bir pencereye ihtiyacınız vardır.
- Datastore ve Firestore benzer ancak farklı veri modellerine sahip olduğundan taşıma işlemi, uygulamanın/hizmetin çalışma şeklinin güncellenmesini gerektirir
- Datastore'dan alınan üst sorguları artık Firestore Koleksiyon sorguları olarak değiştirilmiştir (varsayılan)
- Datastore'dan alınan geniş tür sorgular, Firestore Koleksiyon grubu sorgularıdır
- Dizinler ve işleme farklıdır vb.
Tüm bunların yanında, taşıma işlemi için değerlendirmeniz gereken oldukça basit bir uygulamanız varsa veya bu tür bir taşıma simülasyonuna hazırlıyorsanız ya da sadece Datastore ve Firestore hakkında bilgi edinmek istiyorsanı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 aynı zamanda 2.x'i de desteklediğinden kullanıcılar kullanımdaki farkları hesaplayabilir. Örneğin, Firestore kayıtlarının bayt dizeleri yerine Unicode dizeleri kullanmasıdır. Dolayısıyla, Python 2 dize değişmez değerleri için u''
başında bir gösterge gerekir. Diğer bir deyişle, 2.x store_visit()
işlevi aşağıdaki gibi 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ığının benzer şekilde çalışması gerekir. Dikkate alınması gereken diğer tek sorun, 2.x Cloud Firestore kitaplığının "dondurulmuş" olmasıdır. Bu nedenle, gittikçe daha fazla/yeni özellik yalnızca 3.x Firestore istemci kitaplığında mevcut olacak.
Taşıma işleminde, bu eğiticinin ana adımları şunlardır:
- Kurulum/Ön Çalışma
- Cloud Firestore kitaplığı ekle
- Uygulama dosyalarını güncelle
3. Kurulum/Ön Çalışma
Eğiticinin ana bölümüne geçmeden önce projemizi oluşturalım, kodu alın ve sonra çalışan kodla başladığımızı öğrenmemiz için temel uygulamayı dağıtalım.
1. Proje oluşturun
Modül 3 codelab'ini tamamlamak için kullandığınız projeyi 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 (uygulamanın) etkin olduğundan emin olun.
2. Temel örnek uygulamayı al
Bu codelab'in ön koşullarından biri, çalışan bir Modül 3 örnek uygulamasına sahip olmaktır. Böyle bir uygulamanız yoksa buraya geçmeden önce Modül 3 eğitimini (yukarıdaki bağlantı) tamamlayın. Aksi takdirde, modülün içeriğine aşinaysanız aşağıdaki Modül 3 kodunu alarak başlayabilirsiniz.
İster sizin ister bizimkininkini kullanın, Modül 3 kodunu kullanmaya BAŞLAYacağız. Bu Modül 6 codelab'i, her adımda size yol gösterir. Tamamlandığında, FINISH noktasındaki koda benzeyecektir. (Bu eğitim yalnızca Python 3 için kullanılabilir.)
- BAŞLANGIÇ: Modül 3 depo
- FINISH: Modül 6 depo
- Deponun tamamı (ZIP dosyasını klonlayın veya indirin)
Modül 3 dosyalarının dizini (sizin veya bizimki) şöyle görünmelidir:
$ ls
README.md main.py templates
app.yaml requirements.txt
3. (Yeniden) Modül 3 uygulamasını dağıtın
Hemen yürütmek için kalan ön çalışma adımlarınız:
gcloud
komut satırı aracını (gerekirse) yeniden tanıyın- (Gerekiyorsa) Modül 3 kodunu App Engine'e dağıtın (yeniden)
Bu adımları başarıyla uygulayıp çalışır durumda olduğunu onayladıktan sonra, yapılandırma dosyalarından başlayarak bu eğiticide ilerleyeceğiz.
Python 2 gereksinimleri
app.yaml
öğesinin (hâlâ) üçüncü tarafların gruplandırılmış paketlerine (grpcio
vesetuptools
) başvurduğundan emin olun.appengine_config.py
hizmetinin, uygulamayı üçüncü taraf kaynaklarına yönlendirmek için hâlâpkg_resources
vegoogle.appengine.ext.vendor
kullandığından emin olun.requirements.txt
güncellemesinin bir sonraki bölümünde, Python Firestore istemci kitaplığının 2.x uyumlu son sürümü olduğu içingoogle-cloud-firestore==1.9.0
kullanmanız gerekir.requirements.txt
öğenizdegoogle-cloud-core
ile ilgili bir giriş varsa olduğu gibi bırakın.lib
dosyasını silin vepip install -t lib -r requirements.txt
ile yeniden yükleyin.
4. Yapılandırma dosyalarını güncelleme (Cloud Firestore kitaplığı ekleme)
Kurulumun ardından, atılması gereken sonraki adımlar yapılandırmayı güncellemek ve ardından uygulama dosyalarını yüklemektir. İlk yapılandırma için tek yapılandırma değişikliği, requirements.txt
dosyanızdaki küçük paket değişimidir. Şimdi bunu yapalım.
requirements.txt
içinde google-cloud-datastore
satırını google-cloud-firestore
ile değiştirerek aşağıdaki gibi görünür:
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ının yapıldığı tarihte en günceldir. FINISH kod deposu 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üncelle
main.py
olarak yalnızca bir uygulama dosyası bulunduğundan bu bölümdeki tüm değişiklikler yalnızca o dosyayı etkiler.
1. İçe aktarılanlar
datastore
paketinden firestore
paketine geçiş, küçük bir değişikliktir:
- ÖNCE:
from google.cloud import datastore
- SONRASI:
from google.cloud import firestore
2. Firestore erişimi
Flask'ı başlattıktan sonra Firestore istemcinizi oluşturun. İstemci başlatma için yukarıdakine benzer bir değişiklik yapın:
- ÖNCE:
app = Flask(__name__)
ds_client = datastore.Client()
- SONRASI:
app = Flask(__name__)
fs_client = firestore.Client()
Cloud NDB'den Cloud Datastore'a geçiş yaptığınızda, Cloud Firestore'a erişmek için gereken zorlu adımları zaten tamamlamış oldunuz. Datastore ile veri kayıtlarını Ortak Özelliklerden oluşan varlıklar biçiminde 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 gruplanmış belgelerdir. Datastore'dan geçiş yapmak için bu farklılıklar hakkında düşünmeniz gerekir. Çünkü bunlar, hem veri kayıtları oluştururken hem de bunlar için sorgulama yaparken ortaya çıkar. Sonuçlarınız, Datastore kodunuzun ne kadar karmaşık olduğuna bağlı olarak değişiklik gösterebilir.
Datastore için filtreleme ve sıralama ölçütlerinin yanı sıra Varlık türüne göre sorgular yaparsınız. Firestore'da veri sorgulama işlemleri benzerdir. Aşağıdaki sorgu değerlerinin, istemcilerin (sırasıyla ds_client
veya fs_client
) ve içe aktarma işlemlerinin bulunduğunu varsaydığımız küçük 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 güncel on Visit
varlığını 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 Visit
koleksiyonundaki yer alan Firestore için de yapabilirsiniz:
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 olarak Cloud Datastore kodunu aşağıda bulabilirsiniz:
- ÖNCE:
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 varlıklara benzer yeni dokümanlar ve daha önce gösterildiği gibi sorgular oluşturursunuz.
- SONRASI:
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, index.html
şablon dosyasıyla aynı kalır. Değişikliklerinizi tekrar kontrol edin, kaydedin, dağıtın ve doğrulayın.
6. Özet/Temizlik
Uygulamayı dağıtma
Uygulamanızı gcloud app deploy
ile yeniden dağıtın ve uygulamanın çalıştığını onaylayın. Kodunuz artık Modül 6 deposundaki (veya tercih ettiğiniz bir sürümse 2.x sürümü) ile eşleşmelidir.
Bu seriye, önceki codelab'lerden herhangi birini gerçekleştirmeden başladıysanız uygulamanın kendisi değişmez. ana web sayfasına (/
) yapılan tüm ziyaretleri kaydeder ve siteyi yeteri kadar kez ziyaret ettiğinizde aşağıdaki gibi görünür:
Bu isteğe bağlı Modül 6 taşıma işlemini tamamladığınız için tebrik ederiz. Bu, App Engine veri depolama alanı kullanılana kadar gerçekleştirebileceğiniz, son olmasa da muhtemelen en son taşıma işlemlerinden biridir. Alternatif olarak, henüz yapmadıysanız uygulamanızı Cloud Run için container mimarisine alma işlemi de (Aşağıda bağlantısı verilen Modül 4 ve 5'e 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 yapmaya ne dersiniz? Mevcut geliştiriciler olarak muhtemelen App Engine'in fiyatlandırma bilgileri konusunda yeterince bilgi sahibisinizdir.
İsteğe bağlı: Uygulamayı devre dışı bırakma
Henüz bir sonraki eğitime geçmeye hazır değilseniz sizden ücret alınmasını önlemek için uygulamanızı devre dışı bırakın. Bir sonraki codelab'e geçmeye hazır olduğunuzda projeyi yeniden etkinleştirebilirsiniz. Uygulamanız devre dışı bırakıldığında ücretlendirilecek trafik almazsınız ancak ücretsiz kotayı aşarsanız Firestore kullanımınız nedeniyle faturalandırılabilirsiniz. Bu nedenle, bu sınırın altına düşecek kadar silin.
Öte yandan, taşıma işlemine devam etmeyecekseniz ve her şeyi tamamen silmek istiyorsanız projenizi kapatabilirsiniz.
Sonraki adımlar
Bu eğiticinin dışında, yararlanabileceğiniz diğer taşıma modülü codelab'leri de mevcuttur:
- 7. Modül: App Engine Aktarma Görev Sıraları ([push] Görev Sıraları kullanıyorsanız gereklidir)
- 1. Modül uygulamasına App Engine
taskqueue
aktarma görevleri ekler - Kullanıcıları Modül 8'de Cloud Tasks'a taşıma işlemi için hazırlar
- 1. Modül uygulamasına App Engine
- 4. Modül: Docker ile Cloud Run'a Geçiş
- Docker ile Cloud Run'da çalışması için uygulamanızı container mimarisine alın
- Bu taşıma işlemiyle Python 2'de kalabilirsiniz.
- 5. Modül: Cloud Buildpacks ile Cloud Run'a Geçiş
- Cloud Buildpacks ile uygulamanızı Cloud Run'da çalıştırmak için container mimarisine alın
- Docker, container'lar veya
Dockerfile
hakkında herhangi bir şey bilmeniz gerekmez. - Uygulamanızın Python 3'e zaten taşınmış olmasını gerektirir (Derleme paketleri, Python 2'yi desteklemez)
7. Ek kaynaklar
App Engine taşıma modülü codelab'leri ile ilgili sorunlar/geri bildirimler
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 3 (START) ve Modül 6 (FINISH) için depo klasörlerinin bağlantılarını aşağıdaki tabloda bulabilirsiniz. Bu dosyalara tüm App Engine taşıma işlemleri için depodan da erişilebilir. Bu depoyu klonlayabilir veya ZIP dosyası indirebilirsiniz.
Codelab | Python 2 | Python 3 |
(kod) | ||
6. Modül | (Yok) |
App Engine kaynakları
Bu taşıma işlemiyle ilgili ek kaynaklar aşağıda verilmiştir:
- Python Cloud Datastore ve Cloud Firestore referansları
- Python 3 ve GAE yeni nesil çalışma zamanına geçiş
- Genel