1. Ringkasan
Rangkaian codelab Stasiun Migrasi Serverless (tutorial interaktif dan mandiri) dan video terkait bertujuan untuk membantu developer tanpa server Google Cloud memodernisasi aplikasi mereka dengan memandu mereka melalui satu atau beberapa migrasi, terutama yang beralih dari layanan lama. Dengan melakukannya, aplikasi Anda akan menjadi lebih portabel serta memberi Anda lebih banyak opsi dan fleksibilitas, sehingga Anda dapat berintegrasi dengan dan mengakses lebih banyak produk Cloud serta melakukan upgrade ke rilis bahasa yang lebih baru dengan lebih mudah. Meskipun awalnya berfokus pada pengguna Cloud paling awal, terutama developer App Engine (lingkungan standar), seri ini cukup luas untuk mencakup platform serverless lainnya seperti Cloud Functions dan Cloud Run, atau platform lainnya jika berlaku.
Codelab ini mengajarkan cara menggunakan tugas push Antrean Tugas App Engine dalam aplikasi contoh dari codelab Modul 1. Postingan blog dan video Modul 7 melengkapi tutorial ini, yang memberikan ringkasan singkat tentang konten dalam tutorial ini.
Dalam modul ini, kita akan menambahkan penggunaan tugas push, lalu memigrasikan penggunaan tersebut ke Cloud Tasks di Modul 8 dan yang lebih baru ke Python 3 serta Cloud Datastore di Modul 9. Mereka yang menggunakan Task Queue untuk tugas pull akan dimigrasikan ke Cloud Pub/Sub dan harus merujuk ke Modul 18-19.
Anda akan mempelajari cara
- Menggunakan App Engine Task Queue API/layanan paket
- Menambahkan penggunaan tugas push ke aplikasi Python 2 Flask App Engine NDB dasar
Yang Anda butuhkan
- Project Google Cloud dengan akun penagihan GCP aktif
- Keterampilan Python dasar
- Pengetahuan perintah Linux umum yang berfungsi
- Pengetahuan dasar tentang mengembangkan dan men-deploy aplikasi App Engine
- Aplikasi App Engine Modul 1 yang berfungsi (menyelesaikan codelabnya [direkomendasikan] atau menyalin aplikasi dari repo)
Survei
Bagaimana Anda akan menggunakan tutorial ini?
Bagaimana penilaian Anda terhadap pengalaman dengan Python?
Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?
2. Latar belakang
Task Queue App Engine mendukung tugas push dan pull. Untuk meningkatkan portabilitas aplikasi, tim Google Cloud merekomendasikan migrasi dari layanan paket lama seperti Task Queue ke layanan Cloud mandiri lain atau layanan pihak ketiga yang setara.
- Pengguna Tugas push Task Queue harus bermigrasi ke Cloud Tasks.
- Pengguna tugas pull Task Queue harus bermigrasi ke Cloud Pub/Sub.
Migrasi tugas pull dibahas dalam Modul Migrasi 18-19 sementara Modul 7-9 berfokus pada migrasi tugas push. Untuk bermigrasi dari tugas push Task Queue App Engine, tambahkan penggunaannya ke aplikasi NDB Flask dan App Engine yang ada yang dihasilkan dari codelab Modul 1. Dalam aplikasi tersebut, tampilan halaman baru mendaftarkan Kunjungan baru dan menampilkan kunjungan terbaru kepada pengguna. Karena kunjungan lama tidak akan ditampilkan lagi dan menggunakan ruang penyimpanan di Datastore, kita akan membuat tugas push untuk menghapus kunjungan terlama secara otomatis. Di depan Modul 8, kita akan memigrasikan aplikasi tersebut dari Task Queue ke Cloud Tasks.
Tutorial ini menampilkan langkah-langkah berikut:
- Penyiapan/Prakerja
- Update konfigurasi
- Mengubah kode aplikasi
3. Penyiapan/Prakerja
Bagian ini menjelaskan cara:
- Menyiapkan project Cloud
- Dapatkan aplikasi contoh dasar pengukuran
- Deploy (ulang) dan validasi aplikasi dasar pengukuran
Langkah-langkah ini memastikan Anda memulai dengan kode yang berfungsi.
1. Siapkan project
Jika Anda telah menyelesaikan codelab Modul 1, sebaiknya gunakan kembali project (dan kode) yang sama. Atau, Anda dapat membuat project baru atau menggunakan kembali project lain yang sudah ada. Pastikan project memiliki akun penagihan aktif dan App Engine diaktifkan.
2. Dapatkan aplikasi contoh dasar pengukuran
Salah satu prasyarat untuk codelab ini adalah memiliki aplikasi App Engine Modul 1 yang berfungsi: selesaikan codelab Modul 1 (direkomendasikan) atau salin aplikasi Modul 1 dari repo. Baik Anda menggunakan kode Anda atau kode kami, kode Modul 1 adalah tempat kita akan "MULAI". Codelab ini memandu Anda melalui setiap langkah, yang diakhiri dengan kode yang mirip dengan yang ada di folder repo Modul 7 "FINISH".
- START: Folder Modul 1 (Python 2)
- FINISH: Folder Modul 7 (Python 2)
- Seluruh repo (untuk meng-clone atau mendownload file ZIP)
Terlepas dari aplikasi Modul 1 yang Anda gunakan, foldernya akan terlihat seperti di bawah ini, mungkin juga dengan folder lib
:
$ ls README.md main.py templates app.yaml requirements.txt
3. Deploy (ulang) aplikasi dasar pengukuran
Jalankan langkah-langkah berikut untuk men-deploy (ulang) aplikasi Modul 1:
- Hapus folder
lib
jika ada dan jalankan:pip install -t lib -r requirements.txt
untuk mengisi ulanglib
. Anda mungkin perlu menggunakan perintahpip2
jika sudah menginstal Python 2 dan 3. - Pastikan Anda telah menginstal dan melakukan inisialisasi alat command line
gcloud
dan meninjau penggunaannya. - Tetapkan project Cloud dengan
gcloud config set project
PROJECT_ID
jika Anda tidak ingin memasukkanPROJECT_ID
dengan setiap perintahgcloud
yang dikeluarkan. - Men-deploy aplikasi contoh dengan
gcloud app deploy
- Pastikan aplikasi Modul 1 berjalan seperti yang diharapkan tanpa masalah saat menampilkan kunjungan terbaru (diilustrasikan di bawah)
4. Update konfigurasi
Tidak ada perubahan yang diperlukan pada file konfigurasi App Engine standar (app.yaml
, requirements.txt
, appengine_config.py
).
5. Mengubah file aplikasi
File aplikasi utama adalah main.py
, dan semua update di bagian ini berkaitan dengan file tersebut. Ada juga update kecil pada template web, templates/index.html
. Berikut adalah perubahan yang akan diterapkan di bagian ini:
- Memperbarui impor
- Tambahkan tugas push
- Menambahkan pengendali tugas
- Perbarui template web
1. Memperbarui impor
Impor google.appengine.api.taskqueue
menghadirkan fungsi Task Queue. Beberapa paket library standar Python juga diperlukan:
- Karena kita menambahkan tugas untuk menghapus kunjungan terlama, aplikasi harus menangani stempel waktu, yang berarti penggunaan
time
dandatetime
. - Untuk mencatat informasi yang berguna terkait eksekusi tugas, kita memerlukan
logging
.
Dengan menambahkan semua impor ini, berikut adalah tampilan kode Anda sebelum dan sesudah perubahan ini:
SEBELUM:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
SETELAH:
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. Menambahkan tugas push (mengumpulkan data untuk tugas, mengantrekan tugas baru)
Dokumentasi push queue menyatakan: "Untuk memproses tugas, Anda harus menambahkannya ke push queue. App Engine menyediakan push queue default, bernama default
, yang dikonfigurasi dan siap digunakan dengan setelan default. Jika mau, Anda bisa menambahkan semua tugas Anda ke antrean default, tanpa harus membuat dan mengonfigurasi antrean lainnya." Codelab ini menggunakan antrean default
agar singkat. Untuk mempelajari lebih lanjut cara menetapkan push queue Anda sendiri dengan karakteristik yang sama atau berbeda, lihat dokumentasi Membuat Antrean Push.
Tujuan utama codelab ini adalah menambahkan tugas (ke push queue default
) yang tugasnya adalah menghapus kunjungan lama dari Datastore yang tidak lagi ditampilkan. Aplikasi dasar pengukuran mendaftarkan setiap kunjungan (permintaan GET
hingga /
) dengan membuat entity Visit
baru, lalu mengambil dan menampilkan kunjungan terbaru. Tidak ada kunjungan terlama yang akan ditampilkan atau digunakan lagi, sehingga tugas push menghapus semua kunjungan yang lebih lama dari kunjungan terlama yang ditampilkan. Untuk melakukannya, perilaku aplikasi perlu sedikit diubah:
- Saat membuat kueri kunjungan terbaru, alih-alih langsung menampilkan kunjungan tersebut, ubah aplikasi untuk menyimpan stempel waktu
Visit
terakhir, yang terlama ditampilkan—Anda dapat menghapus semua kunjungan yang lebih lama dari ini. - Buat tugas push dengan stempel waktu ini sebagai payload-nya, lalu arahkan ke pengendali tugas yang dapat diakses melalui
POST
HTTP ke/trim
. Secara khusus, gunakan utilitas Python standar untuk mengonversi stempel waktu Datastore dan mengirimkannya (sebagai float) ke tugas, tetapi juga mencatatnya (sebagai string) dan menampilkan string tersebut sebagai nilai sentinel untuk ditampilkan kepada pengguna.
Semua ini berlangsung di fetch_visits()
, dan seperti inilah tampilannya sebelum dan sesudah pembaruan ini:
SEBELUM:
def fetch_visits(limit):
return (v.to_dict() for v in Visit.query().order(
-Visit.timestamp).fetch(limit))
SETELAH:
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. Menambahkan pengendali tugas (kode yang dipanggil saat tugas berjalan)
Meskipun penghapusan kunjungan lama dapat dengan mudah dilakukan di fetch_visits()
, ketahuilah bahwa fungsi ini tidak ada hubungannya dengan pengguna akhir. Ini adalah fungsi tambahan dan kandidat yang baik untuk memproses secara asinkron di luar permintaan aplikasi standar. Pengguna akhir akan mendapatkan manfaat dari kueri yang lebih cepat karena informasi di Datastore akan lebih sedikit. Buat fungsi baru trim()
, yang dipanggil melalui permintaan POST
Task Queue ke /trim
, yang melakukan hal berikut:
- Mengekstrak "kunjungan terlama" payload stempel waktu
- Masalah kueri Datastore untuk menemukan semua entity yang lebih lama dari stempel waktu tersebut.
- Memilih untuk "hanya kunci" yang lebih cepat karena tidak ada data pengguna aktual yang dibutuhkan.
- Mencatat jumlah entity yang akan dihapus (termasuk nol).
- Memanggil
ndb.delete_multi()
untuk menghapus entity apa pun (dilewati jika tidak). - Menampilkan string kosong (bersama dengan kode pengembalian HTTP 200 implisit).
Anda dapat melihat semua itu di trim()
di bawah. Tambahkan ke main.py
tepat setelah fetch_visits()
:
@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. Perbarui template web
Perbarui template web, templates/index.html
, dengan Jinja2 ini bersyarat untuk menampilkan stempel waktu terlama jika variabel tersebut ada:
{% if oldest is defined %}
<b>Deleting visits older than:</b> {{ oldest }}</p>
{% endif %}
Tambahkan cuplikan ini setelah daftar kunjungan yang ditampilkan, tetapi sebelum menutup isi, sehingga template Anda terlihat seperti ini:
<!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. Ringkasan/Pembersihan
Bagian ini mengakhiri codelab ini dengan men-deploy aplikasi, yang memverifikasi bahwa aplikasi berfungsi sebagaimana mestinya dan dalam output yang ditampilkan. Setelah validasi aplikasi, lakukan semua pembersihan dan pertimbangkan langkah berikutnya.
Men-deploy dan memverifikasi aplikasi
Men-deploy aplikasi dengan gcloud app deploy
. Output harus identik dengan aplikasi Modul 1, kecuali untuk baris baru di bagian bawah yang menampilkan kunjungan yang akan dihapus:
Selamat, Anda telah menyelesaikan codelab. Kode Anda sekarang seharusnya cocok dengan yang ada di folder repo Modul 7. Sekarang, modul ini siap untuk dimigrasikan ke Cloud Tasks di Modul 8.
Pembersihan
Umum
Jika sudah selesai untuk saat ini, sebaiknya nonaktifkan aplikasi App Engine agar tidak menimbulkan penagihan. Namun, jika Anda ingin menguji atau bereksperimen lagi, platform App Engine memiliki kuota gratis, dan asalkan Anda tidak melebihi tingkat penggunaan tersebut, Anda tidak akan dikenai biaya. Itu berlaku untuk komputasi, tetapi mungkin juga ada biaya untuk layanan App Engine yang relevan. Jadi, periksa halaman harganya untuk mengetahui informasi selengkapnya. Jika migrasi ini melibatkan layanan Cloud lainnya, layanan tersebut akan ditagih secara terpisah. Dalam kedua kasus tersebut, jika berlaku, lihat "Khusus untuk codelab ini" di bawah ini.
Untuk pengungkapan penuh, deployment ke platform komputasi serverless Google Cloud seperti App Engine akan menimbulkan biaya build dan penyimpanan yang kecil. Cloud Build memiliki kuota gratisnya sendiri seperti halnya Cloud Storage. Penyimpanan gambar tersebut menghabiskan sebagian kuota tersebut. Namun, Anda mungkin tinggal di region yang tidak memiliki paket gratis tersebut, jadi perhatikan penggunaan penyimpanan Anda untuk meminimalkan potensi biaya. "Folder" Cloud Storage tertentu yang harus Anda tinjau mencakup:
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
- Link penyimpanan di atas bergantung pada
PROJECT_ID
dan *LOC
*asi Anda, misalnya, "us
" jika aplikasi Anda dihosting di AS.
Di sisi lain, jika Anda tidak akan melanjutkan aplikasi ini atau codelab migrasi terkait lainnya dan ingin menghapus semuanya sepenuhnya, nonaktifkan project Anda.
Khusus untuk codelab ini
Layanan yang tercantum di bawah bersifat unik untuk codelab ini. Lihat dokumentasi setiap produk untuk mengetahui informasi selengkapnya:
- Layanan Task Queue App Engine tidak dikenai penagihan tambahan per halaman harga untuk layanan lama yang dipaketkan seperti Task Queue.
- Layanan App Engine Datastore disediakan oleh Cloud Datastore (Cloud Firestore dalam mode Datastore) yang juga memiliki paket gratis; lihat halaman harganya untuk mengetahui informasi selengkapnya.
Langkah berikutnya
Dalam “migrasi” ini, Anda telah menambahkan penggunaan push queue Task Queue ke aplikasi contoh Modul 1, yang menambahkan dukungan untuk melacak pengunjung, sehingga menghasilkan aplikasi contoh Modul 7. Migrasi berikutnya mengajarkan cara melakukan upgrade dari tugas push App Engine ke Cloud Tasks jika Anda ingin melakukannya. Mulai Musim Gugur 2021, pengguna tidak perlu lagi bermigrasi ke Cloud Tasks saat mengupgrade ke Python 3. Baca selengkapnya tentang hal ini di bagian berikutnya.
Jika Anda ingin pindah ke Cloud Tasks, baca codelab Modul 8 berikutnya. Selain itu ada migrasi tambahan yang perlu dipertimbangkan, seperti Cloud Datastore, Cloud Memorystore, Cloud Storage, atau Cloud Pub/Sub (antrean pull). Migrasi lintas produk juga berlaku untuk Cloud Run dan Cloud Functions. Semua konten Stasiun Migrasi Serverless (codelab, video, kode sumber [jika tersedia]) dapat diakses di repo open source-nya.
7. Migrasi ke Python 3
Pada musim gugur 2021, tim App Engine memperluas dukungan untuk banyak layanan yang dipaketkan ke runtime generasi ke-2 (awalnya hanya tersedia dalam runtime generasi ke-1). Artinya, Anda tidak perlu lagi bermigrasi dari layanan paket seperti App Engine Task Queue ke Cloud mandiri atau pihak ketiga yang setara seperti Cloud Tasks saat melakukan porting aplikasi ke Python 3. Dengan kata lain, Anda dapat terus menggunakan Task Queue di aplikasi App Engine Python 3, asalkan Anda memperbaiki kode untuk mengakses layanan paket dari runtime generasi berikutnya.
Anda dapat mempelajari lebih lanjut cara memigrasikan penggunaan layanan yang dipaketkan ke Python 3 di codelab Modul 17 dan video terkaitnya. Meskipun topik itu di luar cakupan Modul 7, yang ditautkan di bawah ini adalah versi Python 3 dari aplikasi Modul 1 dan 7 yang di-port ke Python 3 dan masih menggunakan App Engine NDB dan Task Queue.
8. Referensi lainnya
Di bawah ini adalah referensi tambahan untuk developer yang mempelajari lebih lanjut Modul Migrasi ini atau terkait serta produk terkait. Ini mencakup tempat untuk memberikan masukan tentang konten ini, link ke kode, dan berbagai dokumentasi yang mungkin berguna bagi Anda.
Masalah/masukan Codelab
Jika Anda menemukan masalah dengan codelab ini, telusuri masalah Anda terlebih dahulu sebelum mengajukan masalah. Link untuk menelusuri dan membuat masalah baru:
Referensi migrasi
Link ke folder repo untuk Modul 2 (START) dan Modul 7 (FINISH) dapat ditemukan pada tabel di bawah.
Codelab | Python 2 | Python 3 |
code (tidak ditampilkan dalam tutorial ini) | ||
Modul 7 (codelab ini) | code (tidak ditampilkan dalam tutorial ini) |
Sumber daya {i>online<i}
Di bawah ini adalah referensi online yang mungkin relevan untuk tutorial ini:
Task Queue App Engine
- Ringkasan Task Queue App Engine
- Ringkasan push queue App Engine Task Queue
- Membuat push queue Task Queue
queue.yaml
referensiqueue.yaml
vs. Cloud Tasks- Mendorong antrean ke panduan migrasi Cloud Tasks
- Push queue App Engine Task Queue ke contoh dokumentasi Cloud Tasks
Platform App Engine
- Dokumentasi App Engine
- Runtime App Engine (lingkungan standar) Python 2
- Menggunakan library bawaan App Engine di Python 2 App Engine
- Runtime App Engine (lingkungan standar) Python 3
- Perbedaan antara Python 2 & 3 runtime App Engine (lingkungan standar)
- Panduan migrasi App Engine (lingkungan standar) Python 2 ke 3
- Informasi harga dan kuota App Engine
- Peluncuran platform App Engine generasi kedua (2018)
- Membandingkan terlebih dahulu & platform generasi kedua
- Dukungan jangka panjang untuk runtime lama
- Contoh migrasi dokumentasi
- Contoh migrasi kontribusi komunitas
Informasi Cloud lainnya
- Python di Google Cloud Platform
- Library klien Python Google Cloud
- Google Cloud "Selalu Gratis" tingkat lanjut
- Google Cloud SDK (alat command line
gcloud
) - Semua dokumentasi Google Cloud
Video
- Stasiun Migrasi Serverless
- Ekspedisi Serverless
- Berlangganan Google Cloud Tech
- Berlangganan Google Developers
Lisensi
Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.