Cara menggunakan Task Queue App Engine (tugas pull) di aplikasi Flask (Modul 18)

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 menyertakan dan menggunakan tugas pull Antrean Tugas App Engine ke aplikasi contoh dari codelab Modul 1. Kami menambahkan penggunaan tugas pull dalam tutorial Modul 18 ini, lalu memigrasikan penggunaan tersebut ke Cloud Pub/Sub terlebih dahulu di Modul 19. Tugas yang menggunakan Task Queue untuk tugas push akan dimigrasikan ke Cloud Tasks dan harus merujuk ke Modul 7-9.

Anda akan mempelajari cara

  • Menggunakan App Engine Task Queue API/layanan paket
  • Menambahkan penggunaan pull queue 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

Untuk bermigrasi dari tugas pull Task Queue App Engine, tambahkan penggunaannya ke aplikasi NDB Flask dan App Engine yang ada yang dihasilkan dari codelab Modul 1. Aplikasi contoh menampilkan kunjungan terbaru ke pengguna akhir. Tidak apa-apa, tetapi akan lebih menarik juga untuk melacak pengunjung guna melihat siapa yang paling banyak mengunjungi situs.

Meskipun kita dapat menggunakan tugas push untuk jumlah pengunjung ini, kita ingin membagi tanggung jawab antara aplikasi contoh yang tugasnya adalah mencatat kunjungan dan segera merespons pengguna, dan "pekerja" yang ditetapkan yang tugasnya adalah menghitung jumlah pengunjung di luar alur kerja permintaan-respons normal.

Untuk menerapkan desain ini, kita menambahkan penggunaan antrean pull ke aplikasi utama serta mendukung fungsi pekerja. Pekerja dapat berjalan sebagai proses terpisah (seperti instance backend atau kode yang berjalan pada VM yang selalu aktif), cron job, atau permintaan HTTP command line dasar menggunakan curl atau wget. Setelah integrasi ini, Anda dapat memigrasikan aplikasi ke Cloud Pub/Sub di codelab berikutnya (Modul 19).

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, gunakan kembali project (dan kode) yang sama. Atau, buat project baru atau gunakan kembali project lain yang sudah ada. Pastikan project memiliki akun penagihan aktif dan aplikasi App Engine yang aktif. Temukan project ID karena Anda perlu memilikinya beberapa kali dalam codelab ini dan menggunakannya setiap kali menemukan variabel PROJECT_ID.

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 18 "FINISH".

Terlepas dari aplikasi Modul 1 yang Anda gunakan, folder akan terlihat seperti output di bawah, mungkin juga dengan folder lib:

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

3. Deploy (ulang) aplikasi dasar pengukuran

Jalankan langkah-langkah berikut untuk men-deploy 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 dan 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). Sebagai gantinya, tambahkan file konfigurasi baru, queue.yaml, dengan konten berikut, dan tempatkan di direktori tingkat atas yang sama:

queue:
- name: pullq
  mode: pull

File queue.yaml menentukan semua task queue yang ada untuk aplikasi Anda (kecuali antrean default [push] yang dibuat secara otomatis oleh App Engine). Dalam kasus ini, hanya ada satu, yaitu antrean pull bernama pullq. App Engine mengharuskan perintah mode ditentukan sebagai pull. Jika tidak, App Engine akan membuat push queue secara default. Pelajari lebih lanjut cara membuat antrean pull di dokumentasi. Lihat juga halaman referensi queue.yaml untuk opsi lainnya.

Deploy file ini secara terpisah dari aplikasi Anda. Anda akan tetap menggunakan gcloud app deploy, tetapi juga menyediakan queue.yaml di command line:

$ gcloud app deploy queue.yaml
Configurations to update:

descriptor:      [/tmp/mod18-gaepull/queue.yaml]
type:            [task queues]
target project:  [my-project]

WARNING: Caution: You are updating queue configuration. This will override any changes performed using 'gcloud tasks'. More details at
https://cloud.google.com/tasks/docs/queue-yaml

Do you want to continue (Y/n)?

Updating config [queue]...⠹WARNING: We are using the App Engine app location (us-central1) as the default location. Please use the "--location" flag if you want to use a different location.
Updating config [queue]...done.

Task queues have been updated.

Visit the Cloud Platform Console Task Queues page to view your queues and cron jobs.
$

5. Mengubah kode aplikasi

Bagian ini menampilkan pembaruan untuk file berikut:

  • main.py — menambahkan penggunaan pull queue ke aplikasi utama
  • templates/index.html — memperbarui template web untuk menampilkan data baru

Impor dan konstanta

Langkah pertama adalah menambahkan satu impor baru dan beberapa konstanta untuk mendukung antrean pull:

  • Tambahkan impor library Task Queue, google.appengine.api.taskqueue.
  • Tambahkan tiga konstanta untuk mendukung menyewa jumlah maksimum tugas pull (TASKS) selama satu jam (HOUR) dari antrean pull (QUEUE).
  • Tambahkan konstanta untuk menampilkan kunjungan terbaru serta pengunjung teratas (LIMIT).

Berikut adalah kode asli dan tampilannya setelah pembaruan dilakukan:

SEBELUM:

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

app = Flask(__name__)

SETELAH:

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

HOUR = 3600
LIMIT = 10
TASKS = 1000
QNAME = 'pullq'
QUEUE = taskqueue.Queue(QNAME)
app = Flask(__name__)

Menambahkan tugas pull (mengumpulkan data untuk tugas &membuat tugas di antrean pull)

Model data Visit tetap sama, seperti halnya membuat kueri kunjungan untuk ditampilkan di fetch_visits(). Satu-satunya perubahan yang diperlukan di bagian kode ini adalah di store_visit(). Selain mendaftarkan kunjungan, tambahkan tugas ke antrean pull dengan alamat IP pengunjung agar pekerja dapat menambahkan penghitung pengunjung.

SEBELUM:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

SETELAH:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit in Datastore and queue request to bump visitor count'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
    QUEUE.add(taskqueue.Task(payload=remote_addr, method='PULL'))

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

Membuat model data dan fungsi kueri untuk pelacakan pengunjung

Tambahkan model data VisitorCount untuk melacak pengunjung; data tersebut harus memiliki kolom untuk visitor serta bilangan bulat counter untuk melacak jumlah kunjungan. Kemudian, tambahkan fungsi baru (sebagai alternatif, dapat berupa Python classmethod) bernama fetch_counts() untuk membuat kueri dan menampilkan pengunjung teratas dalam urutan paling kecil. Tambahkan class dan fungsi tepat di bawah isi fetch_visits():

class VisitorCount(ndb.Model):
    visitor = ndb.StringProperty(repeated=False, required=True)
    counter = ndb.IntegerProperty()

def fetch_counts(limit):
    'get top visitors'
    return VisitCount.query().order(-VisitCount.counter).fetch(limit)

Menambahkan kode pekerja

Tambahkan fungsi baru log_visitors() untuk mencatat pengunjung melalui permintaan GET ke /log. Performance Planner menggunakan kamus/hash untuk melacak jumlah pengunjung terbaru, dengan menggunakan sebanyak mungkin tugas selama satu jam. Untuk setiap tugas, laporan ini menghitung semua kunjungan oleh pengunjung yang sama. Setelah penghitungan tersedia, aplikasi kemudian memperbarui semua entity VisitorCount terkait yang sudah ada di Datastore atau membuat yang baru jika diperlukan. Langkah terakhir menampilkan pesan teks biasa yang menunjukkan jumlah pengunjung yang terdaftar dari berapa banyak tugas yang diproses. Tambahkan fungsi ini ke main.py tepat di bawah fetch_counts():

@app.route('/log')
def log_visitors():
    'worker processes recent visitor counts and updates them in Datastore'
    # tally recent visitor counts from queue then delete those tasks
    tallies = {}
    tasks = QUEUE.lease_tasks(HOUR, TASKS)
    for task in tasks:
        visitor = task.payload
        tallies[visitor] = tallies.get(visitor, 0) + 1
    if tasks:
        QUEUE.delete_tasks(tasks)

    # increment those counts in Datastore and return
    for visitor in tallies:
        counter = VisitorCount.query(VisitorCount.visitor == visitor).get()
        if not counter:
            counter = VisitorCount(visitor=visitor, counter=0)
            counter.put()
        counter.counter += tallies[visitor]
        counter.put()
    return 'DONE (with %d task[s] logging %d visitor[s])\r\n' % (
            len(tasks), len(tallies))

Memperbarui pengendali utama dengan data tampilan baru

Untuk menampilkan pengunjung teratas, perbarui pengendali utama root() untuk memanggil fetch_counts(). Selain itu, template akan diperbarui untuk menampilkan jumlah pengunjung teratas dan kunjungan terbaru. Gabungkan jumlah pengunjung beserta kunjungan terbaru dari panggilan ke fetch_visits(), lalu masukkan ke dalam satu context untuk diteruskan ke template web. Berikut adalah kode sebelum dan setelah perubahan ini dilakukan:

SEBELUM:

@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)

SETELAH:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    context = {
        'limit':  LIMIT,
        'visits': fetch_visits(LIMIT),
        'counts': fetch_counts(LIMIT),
    }
    return render_template('index.html', **context)

Ini adalah semua perubahan yang diperlukan dari main.py, dan berikut adalah representasi bergambar dari pembaruan tersebut untuk tujuan ilustrasi guna memberi Anda gambaran umum tentang perubahan yang Anda buat pada main.py:

ad5fd3345efc13d0.png

Perbarui template web dengan data tampilan baru

Template web templates/index.html memerlukan update untuk menampilkan pengunjung teratas selain payload normal pengunjung terbaru. Masukkan pengunjung teratas dan jumlah mereka ke dalam tabel di bagian atas halaman dan lanjutkan menampilkan kunjungan terbaru seperti sebelumnya. Satu-satunya perubahan lainnya adalah menentukan angka yang ditampilkan melalui variabel limit, bukan melakukan hardcode angka. Berikut adalah perubahan yang harus Anda buat pada template web:

SEBELUM:

<!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>

SETELAH:

<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>

<h1>VisitMe example</h1>

<h3>Top {{ limit }} visitors</h3>
<table border=1 cellspacing=0 cellpadding=2>
    <tr><th>Visitor</th><th>Visits</th></tr>
{% for count in counts %}
    <tr><td>{{ count.visitor|e }}</td><td align="center">{{ count.counter }}</td></tr>
{% endfor %}
</table>

<h3>Last {{ limit }} visits</h3>
<ul>
{% for visit in visits %}
    <li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>

Bagian ini mengakhiri perubahan yang diperlukan dengan menambahkan penggunaan tugas pull Task Queue App Engine ke aplikasi contoh Modul 1. Direktori Anda sekarang merepresentasikan aplikasi contoh Modul 18 dan harus berisi file berikut:

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

6. Ringkasan/Pembersihan

Bagian ini mengakhiri codelab ini dengan men-deploy aplikasi, yang memverifikasi bahwa aplikasi berfungsi sebagaimana mestinya dan dalam output yang ditampilkan. Jalankan pekerja secara terpisah untuk memproses jumlah pengunjung. Setelah validasi aplikasi, lakukan langkah-langkah pembersihan dan pertimbangkan langkah berikutnya.

Men-deploy dan memverifikasi aplikasi

Pastikan Anda telah menyiapkan antrean pull Anda seperti yang kita lakukan di dekat bagian atas codelab ini dengan gcloud app deploy queue.yaml. Jika langkah tersebut telah selesai dan aplikasi contoh Anda siap digunakan, deploy aplikasi dengan gcloud app deploy. Output harus identik dengan aplikasi Modul 1, tetapi kini menampilkan "pengunjung teratas" tabel di bagian atas:

b667551dcbab1a09.png

Meskipun frontend web yang diperbarui menampilkan pengunjung teratas dan kunjungan terbaru, pastikan jumlah pengunjung jangan sertakan kunjungan ini. Aplikasi menampilkan jumlah pengunjung sebelumnya sambil meletakkan tugas baru yang menambah jumlah pengunjung ini dalam antrean pull, tugas yang menunggu untuk diproses.

Anda dapat menjalankan tugas dengan memanggil /log, dalam berbagai cara:

Misalnya, jika Anda menggunakan curl untuk mengirim permintaan GET ke /log, output Anda akan terlihat seperti ini, mengingat Anda memberikan PROJECT_ID:

$ curl https://PROJECT_ID.appspot.com/log
DONE (with 1 task[s] logging 1 visitor[s])

Jumlah yang diperbarui kemudian akan terlihat pada kunjungan situs web berikutnya. Selesai.

Selamat, Anda telah berhasil menyelesaikan codelab ini karena telah berhasil menambahkan penggunaan layanan pull queue App Engine Task Queue ke aplikasi contoh. Sekarang siap untuk bermigrasi ke Cloud Pub/Sub, Cloud NDB, dan Python 3 di Modul 19.

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, dengan menambahkan dukungan untuk melacak pengunjung, sehingga menerapkan aplikasi contoh Modul 18. Pada migrasi berikutnya, Anda akan mengupgrade tugas pull App Engine ke Cloud Pub/Sub. Mulai akhir tahun 2021, pengguna tidak lagi harus bermigrasi ke Cloud Pub/Sub saat mengupgrade ke Python 3. Baca selengkapnya tentang hal ini di bagian berikutnya.

Untuk bermigrasi ke Cloud Pub/Sub, lihat codelab Modul 19. Selain itu, ada migrasi tambahan yang perlu dipertimbangkan, seperti Cloud Datastore, Cloud Memorystore, Cloud Storage, atau Cloud Tasks (push queue). 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 (yang memiliki runtime generasi ke-1). Hasilnya, Anda tidak perlu lagi bermigrasi dari layanan paket seperti Task Queue App Engine ke Cloud mandiri atau layanan pihak ketiga seperti Cloud Pub/Sub saat mentransfer aplikasi Anda 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 tersebut di luar cakupan Modul 18, yang ditautkan di bawah ini adalah versi Python 3 dari aplikasi Modul 1 yang di-port ke Python 3 dan masih menggunakan App Engine NDB. (Pada titik tertentu, aplikasi Modul 18 versi Python 3 juga akan tersedia.)

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 1 (START) dan Modul 18 (FINISH) dapat ditemukan pada tabel di bawah. Library tersebut juga dapat diakses dari repo untuk semua migrasi codelab App Engine; melakukan clone atau mendownload file ZIP.

Codelab

Python 2

Python 3

Modul 1

kode

code (tidak ditampilkan dalam tutorial ini)

Modul 18 (codelab ini)

kode

T/A

Referensi {i>online<i}

Berikut adalah referensi yang relevan untuk tutorial ini:

Task Queue App Engine

Platform App Engine

Dokumentasi App Engine

Runtime App Engine (lingkungan standar) Python 2

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)

Dukungan jangka panjang untuk runtime lama

Contoh migrasi dokumentasi

Informasi Cloud lainnya

Video

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.