Cara menggunakan Task Queue App Engine (tugas push) di aplikasi Flask (Modul 7)

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

Survei

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana penilaian Anda terhadap pengalaman dengan Python?

Pemula Menengah Mahir

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?

Pemula Menengah Mahir

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.

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:

  1. Penyiapan/Prakerja
  2. Update konfigurasi
  3. Mengubah kode aplikasi

3. Penyiapan/Prakerja

Bagian ini menjelaskan cara:

  1. Menyiapkan project Cloud
  2. Dapatkan aplikasi contoh dasar pengukuran
  3. 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".

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:

  1. Hapus folder lib jika ada dan jalankan: pip install -t lib -r requirements.txt untuk mengisi ulang lib. Anda mungkin perlu menggunakan perintah pip2 jika sudah menginstal Python 2 dan 3.
  2. Pastikan Anda telah menginstal dan melakukan inisialisasi alat command line gcloud dan meninjau penggunaannya.
  3. Tetapkan project Cloud dengan gcloud config set project PROJECT_ID jika Anda tidak ingin memasukkan PROJECT_ID dengan setiap perintah gcloud yang dikeluarkan.
  4. Men-deploy aplikasi contoh dengan gcloud app deploy
  5. Pastikan aplikasi Modul 1 berjalan seperti yang diharapkan tanpa masalah saat menampilkan kunjungan terbaru (diilustrasikan di bawah)

a7a9d2b80d706a2b.png

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:

  1. Memperbarui impor
  2. Tambahkan tugas push
  3. Menambahkan pengendali tugas
  4. 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 dan datetime.
  • 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:

  1. 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.
  2. 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:

  1. Mengekstrak "kunjungan terlama" payload stempel waktu
  2. Masalah kueri Datastore untuk menemukan semua entity yang lebih lama dari stempel waktu tersebut.
  3. Memilih untuk "hanya kunci" yang lebih cepat karena tidak ada data pengguna aktual yang dibutuhkan.
  4. Mencatat jumlah entity yang akan dihapus (termasuk nol).
  5. Memanggil ndb.delete_multi() untuk menghapus entity apa pun (dilewati jika tidak).
  6. 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:

4aa8a2cb5f527079.pngS

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:

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

Modul 1

kode

code (tidak ditampilkan dalam tutorial ini)

Modul 7 (codelab ini)

kode

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

Platform App Engine

Informasi Cloud lainnya

Video

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.