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

1. Ringkasan

Serangkaian codelab Serverless Migration Station (tutorial praktik mandiri) dan video terkait bertujuan untuk membantu developer serverless Google Cloud memodernisasi aplikasi mereka dengan memandu mereka melalui satu atau beberapa migrasi, terutama beralih dari layanan lama. Dengan melakukannya, aplikasi Anda akan lebih portabel dan Anda akan memiliki lebih banyak opsi dan fleksibilitas, sehingga Anda dapat berintegrasi dengan dan mengakses berbagai produk Cloud serta mengupgrade 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 di tempat lain jika berlaku.

Codelab ini mengajarkan cara menyertakan dan menggunakan tugas pull App Engine Task Queue ke aplikasi contoh dari codelab Modul 1. Kita akan menambahkan penggunaan tugas pull di tutorial Modul 18 ini, lalu memigrasikan penggunaan tersebut ke Cloud Pub/Sub di Modul 19. Pengguna yang menggunakan Task Queues untuk tugas push akan bermigrasi ke Cloud Tasks dan harus melihat Modul 7-9.

Anda akan mempelajari cara

  • Menggunakan App Engine Task Queue API/layanan paket
  • Menambahkan penggunaan pull queue ke aplikasi NDB App Engine Flask Python 2 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 App Engine Task Queue, tambahkan penggunaannya ke aplikasi Flask dan App Engine NDB yang ada yang dihasilkan dari codelab Modul 1. Aplikasi contoh menampilkan kunjungan terbaru ke pengguna akhir. Tidak masalah, tetapi akan lebih menarik jika Anda juga melacak pengunjung untuk melihat siapa yang paling sering berkunjung.

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

Untuk menerapkan desain ini, kita akan menambahkan penggunaan pull queue ke aplikasi utama serta mendukung fungsi pekerja. Worker dapat berjalan sebagai proses terpisah (seperti instance backend atau kode yang berjalan di VM yang selalu aktif), tugas cron, 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 mencakup 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 sudah 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 yang aktif dan aplikasi App Engine yang diaktifkan. Temukan project ID Anda karena Anda akan memerlukannya beberapa kali dalam codelab ini dan gunakan setiap kali Anda 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 "MEMULAI". Codelab ini akan memandu Anda melalui setiap langkah, yang diakhiri dengan kode yang menyerupai kode di folder repo Modul 18 "FINISH".

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

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

3. Deploy (ulang) aplikasi dasar pengukuran

Lakukan 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 Anda telah menginstal Python 2 dan 3.
  2. Pastikan Anda telah menginstal dan menginisialisasi alat command line gcloud serta meninjau penggunaannya.
  3. Tetapkan project Cloud Anda 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 (seperti yang 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 letakkan di direktori tingkat teratas yang sama:

queue:
- name: pullq
  mode: pull

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

Deploy file ini secara terpisah dari aplikasi Anda. Anda tetap akan menggunakan gcloud app deploy, tetapi juga memberikan 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 update pada 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 penarikan:

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

Di bawah ini adalah kode asli dan tampilannya setelah melakukan pembaruan ini:

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 pull queue)

Model data Visit tetap sama, begitu juga dengan kueri untuk kunjungan yang akan ditampilkan di fetch_visits(). Satu-satunya perubahan yang diperlukan di bagian kode ini adalah di store_visit(). Selain mendaftarkan kunjungan, tambahkan tugas ke antrean tarik dengan alamat IP pengunjung sehingga pekerja dapat menambah 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; model ini harus memiliki kolom untuk visitor itu sendiri serta bilangan bulat counter untuk melacak jumlah kunjungan. Kemudian, tambahkan fungsi baru (atau, bisa juga berupa classmethod Python) bernama fetch_counts() untuk membuat kueri dan menampilkan pengunjung teratas dalam urutan paling banyak ke paling sedikit. 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. Fungsi ini menggunakan kamus/hash untuk melacak jumlah pengunjung terbaru, yang menyewakan tugas sebanyak mungkin selama satu jam. Untuk setiap tugas, tugas ini mencatat semua kunjungan oleh pengunjung yang sama. Dengan data yang ada, aplikasi kemudian memperbarui semua entitas VisitorCount yang sesuai yang sudah ada di Datastore atau membuat yang baru jika diperlukan. Langkah terakhir menampilkan pesan teks biasa yang menunjukkan jumlah pengunjung yang terdaftar dari jumlah 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 handler utama dengan data tampilan baru

Untuk menampilkan pengunjung teratas, perbarui handler 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() dan 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)

Berikut semua perubahan yang diperlukan dari main.py, dan berikut representasi bergambar dari update tersebut untuk tujuan ilustrasi guna memberi Anda gambaran luas tentang perubahan yang Anda lakukan pada main.py:

ad5fd3345efc13d0.png

Memperbarui template web dengan data tampilan baru

Template web templates/index.html memerlukan update untuk menampilkan pengunjung teratas selain payload normal pengunjung terbaru. Letakkan pengunjung teratas dan jumlahnya ke dalam tabel di bagian atas halaman dan terus render kunjungan terbaru seperti sebelumnya. Satu-satunya perubahan lainnya adalah menentukan angka yang ditampilkan melalui variabel limit, bukan meng-hardcode angka. Berikut adalah pembaruan yang harus Anda lakukan 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>

Dengan demikian, perubahan yang diperlukan untuk menambahkan penggunaan tugas pull App Engine Task Queue ke aplikasi contoh Modul 1 telah selesai. Direktori Anda kini 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, memverifikasi bahwa aplikasi berfungsi seperti yang diinginkan 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 tarik seperti yang kita lakukan di bagian atas codelab ini dengan gcloud app deploy queue.yaml. Jika sudah selesai dan aplikasi contoh Anda siap digunakan, deploy aplikasi Anda dengan gcloud app deploy. Output harus identik dengan aplikasi Modul 1, kecuali sekarang menampilkan tabel "pengunjung teratas" di bagian atas:

b667551dcbab1a09.png

Meskipun frontend web yang diperbarui menampilkan pengunjung teratas dan kunjungan terbaru, perhatikan bahwa jumlah pengunjung tidak menyertakan kunjungan ini. Aplikasi menampilkan jumlah pengunjung sebelumnya sambil menjatuhkan tugas baru yang meningkatkan jumlah pengunjung ini dalam antrean pull, tugas yang menunggu untuk diproses.

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

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

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

Jumlah yang diperbarui akan ditampilkan pada kunjungan situs berikutnya. Selesai!

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

Pembersihan

Umum

Jika Anda sudah selesai untuk saat ini, sebaiknya nonaktifkan aplikasi App Engine untuk menghindari penagihan. Namun, jika Anda ingin menguji atau bereksperimen lebih lanjut, platform App Engine memiliki kuota gratis, sehingga selama Anda tidak melebihi tingkat penggunaan tersebut, Anda tidak akan dikenai biaya. Biaya tersebut adalah 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 bagian "Khusus untuk codelab ini" di bawah.

Untuk pengungkapan penuh, men-deploy ke platform komputasi serverless Google Cloud seperti App Engine akan menimbulkan biaya build dan penyimpanan kecil. Cloud Build memiliki kuota gratisnya sendiri seperti halnya Cloud Storage. Penyimpanan gambar tersebut menggunakan sebagian kuota tersebut. Namun, Anda mungkin tinggal di wilayah yang tidak memiliki paket gratis tersebut, jadi perhatikan penggunaan penyimpanan Anda untuk meminimalkan potensi biaya. "Folder" Cloud Storage tertentu yang harus Anda tinjau meliputi:

  • 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*Anda, misalnya, "us" jika aplikasi Anda dihosting di Amerika Serikat.

Di sisi lain, jika Anda tidak akan melanjutkan aplikasi ini atau codelab migrasi terkait lainnya dan ingin menghapus semuanya, hentikan project Anda.

Khusus untuk codelab ini

Layanan yang tercantum di bawah ini unik untuk codelab ini. Lihat dokumentasi setiap produk untuk mengetahui informasi selengkapnya:

Langkah berikutnya

Dalam "migrasi" ini, Anda menambahkan penggunaan antrean push Task Queue ke aplikasi contoh Modul 1, dengan menambahkan dukungan untuk melacak pengunjung, sehingga mengimplementasikan aplikasi contoh Modul 18. Dalam migrasi berikutnya, Anda akan mengupgrade tugas pull App Engine ke Cloud Pub/Sub. Mulai akhir tahun 2021, pengguna tidak lagi diwajibkan untuk bermigrasi ke Cloud Pub/Sub saat mengupgrade ke Python 3. Baca lebih lanjut 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). Ada juga migrasi lintas produk ke Cloud Run dan Cloud Functions. Semua konten Serverless Migration Station (codelab, video, kode sumber [jika tersedia]) dapat diakses di repositori open source-nya.

7. Migrasi ke Python 3

Pada Musim Gugur 2021, tim App Engine memperluas dukungan banyak layanan paket ke runtime generasi ke-2 (yang memiliki runtime generasi ke-1). Oleh karena itu, Anda tidak lagi diwajibkan untuk bermigrasi dari layanan paket seperti Task Queue App Engine ke layanan Cloud mandiri atau pihak ketiga seperti Cloud Pub/Sub saat mem-porting aplikasi ke Python 3. Dengan kata lain, Anda dapat terus menggunakan Task Queue di aplikasi App Engine Python 3 selama Anda menyesuaikan kode untuk mengakses layanan paket dari runtime generasi berikutnya.

Anda dapat mempelajari lebih lanjut cara memigrasikan penggunaan layanan paket ke Python 3 dalam codelab Modul 17 dan video terkait. Meskipun topik tersebut di luar cakupan Modul 18, di bawah ini adalah versi Python 3 dari aplikasi Modul 1 yang di-porting ke Python 3 dan masih menggunakan App Engine NDB. (Pada suatu saat, aplikasi Modul 18 versi Python 3 juga akan tersedia.)

8. Referensi lainnya

Di bawah ini tercantum resource tambahan bagi developer yang ingin mempelajari lebih lanjut Modul Migrasi ini atau yang terkait, serta produk terkait. Hal ini mencakup tempat untuk memberikan masukan tentang konten ini, link ke kode, dan berbagai bagian 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. Link tersebut juga dapat diakses dari repo untuk semua migrasi codelab App Engine; clone atau download file ZIP.

Codelab

Python 2

Python 3

Modul 1

kode

code (tidak ditampilkan dalam tutorial ini)

Modul 18 (codelab ini)

kode

T/A

Referensi online

Berikut adalah referensi yang relevan untuk tutorial ini:

Task Queue App Engine

Platform App Engine

Dokumentasi App Engine

Runtime Python 2 App Engine (lingkungan standar)

Runtime Python 3 App Engine (lingkungan standar)

Perbedaan antara runtime Python 2 & 3 App Engine (lingkungan standar)

Panduan migrasi aplikasi Python 2 ke 3 App Engine (lingkungan standar)

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.