Cara menggunakan Memcache App Engine di aplikasi Flask (Modul 12)

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 App Engine Memcache ke aplikasi contoh dari codelab Modul 1. Kita akan menambahkan penggunaan Memcache dalam tutorial Modul 12 ini, lalu bermigrasi ke Cloud Memorystore di Modul 13.

Anda akan mempelajari cara

  • Menggunakan API/library Memcache App Engine
  • Menambahkan caching 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 App Engine Memcache, tambahkan penggunaannya ke aplikasi Flask dan App Engine NDB yang ada yang dihasilkan dari codelab Modul 1. Aplikasi contoh menampilkan sepuluh kunjungan terbaru kepada pengguna. Jika pengguna yang sama me-refresh browsernya, tidaklah optimal untuk terus membuat entity Kunjungan baru dan mengambil kunjungan terbaru dari Datastore, jadi kita akan meng-cache kunjungan terbaru tersebut.

Jika pengunjung yang sama membuka halaman, kunjungan tersebut akan ditampilkan dari cache. Jika pengguna baru mengunjungi situs atau satu jam telah berlalu, cache akan dihapus dan diganti dengan entri terbaru (belum lagi Kunjungan baru yang tercatat). Dengan penerapan integrasi App Engine Memcache ini, kita dapat memigrasikannya ke Cloud Memorystore di codelab berikutnya (Modul 13).

Tutorial ini mencakup langkah-langkah berikut:

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

3. Penyiapan/Prakerja

Sebelum melanjutkan ke bagian utama tutorial, mari kita siapkan project, dapatkan kodenya, lalu deploy aplikasi dasar pengukuran sehingga kita tahu bahwa kita memulai dengan kode yang berfungsi.

1. Siapkan project

Jika Anda sudah 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 yang aktif dan App Engine diaktifkan.

2. Dapatkan aplikasi contoh dasar pengukuran

Salah satu prasyarat untuk codelab ini adalah memiliki aplikasi contoh Modul 1 yang berfungsi. Jika Anda tidak memilikinya, selesaikan salah satu tutorial tersebut (link di atas) sebelum melanjutkan ke sini. Jika sudah terbiasa dengan kontennya, Anda bisa memulai dengan kode Modul 1 di bawah.

Baik Anda menggunakan kode Anda atau kode kami, kode Modul 1 adalah tempat kita akan memulai (START). Codelab ini akan memandu Anda melalui setiap langkah, yang diakhiri dengan kode yang menyerupai kode di folder repo Modul 11 (FINISH).

File awal (START) di direktori Modul 1 (kode Anda atau kode kami) akan terlihat seperti ini:

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

3. Deploy (ulang) aplikasi dasar pengukuran

Langkah prakerja yang tersisa untuk dijalankan sekarang:

  1. Biasakan kembali diri Anda dengan alat command-line gcloud
  2. Deploy kembali aplikasi contoh dengan gcloud app deploy
  3. Konfirmasikan bahwa aplikasi berjalan di App Engine tanpa masalah

Setelah berhasil menjalankan langkah-langkah tersebut dan melihat aplikasi web Anda berfungsi (dengan output yang serupa dengan di bawah), Anda siap menambahkan penggunaan caching ke aplikasi Anda.

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

Karena kita hanya menambahkan App Engine API, tidak ada paket eksternal yang terlibat, yang berarti tidak ada file konfigurasi (app.yaml, requirements.txt, appengine_config.py) yang perlu diperbarui. Hanya ada satu file aplikasi, main.py, sehingga semua perubahan di bagian ini hanya memengaruhi file tersebut.

Impor

Langkah terpenting adalah mengimpor library Memcache, google.appengine.api.memcache. Karena kita akan menyimpan dalam cache kunjungan terbaru selama satu jam, mari kita tambahkan juga konstanta untuk jumlah detik dalam satu jam. Berikut adalah tampilan kode Anda sebelum dan sesudah perubahan 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 memcache
from google.appengine.ext import ndb

app = Flask(__name__)
HOUR = 3600

Menambahkan dukungan penyimpanan ke dalam cache dengan Memcache

Perubahan paling signifikan adalah menambahkan penggunaan caching dalam aplikasi kita. Lebih khusus lagi, kita harus meng-cache kunjungan terbaru, memeriksa apakah kunjungan yang di-cache tersedia, dan mencoba menggunakan hasil yang di-cache sebanyak mungkin sesuai dengan rencana kita. Berikut adalah langkah-langkah yang akan dilakukan aplikasi untuk mencapai tujuan kita:

  1. Tetapkan kunjungan saat ini dan panggil visitor
  2. Mencoba mengambil visits terbaru dari cache
  3. Jika cache kosong atau pengunjung terbaru (visits[0]['visitor']) berbeda dengan visitor saat ini: simpan kunjungan terbaru ini, ambil kunjungan terbaru, dan simpan dalam cache selama satu jam.
  4. Menampilkan visits kepada pengguna melalui template web

Berikut adalah tampilan sebelum dan sesudah dengan pembaruan ini:

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'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    visits = memcache.get('visits')

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0]['visitor'] != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        memcache.set('visits', visits, HOUR)  # set() not add()

    return render_template('index.html', visits=visits)

Berikut adalah representasi bergambar dari perubahan yang dilakukan:

b1242503602f7bf0.png

Dengan demikian, semua perubahan yang diperlukan untuk menambahkan penggunaan App Engine memcache ke aplikasi contoh Modul 1 telah selesai. Mari kita buat dan deploy aplikasi ini untuk melihat cara kerjanya.

6. Ringkasan/Pembersihan

Bagian ini mengakhiri codelab ini dengan men-deploy aplikasi, memverifikasi bahwa aplikasi berfungsi seperti yang diinginkan dan dalam output yang ditampilkan. Setelah validasi aplikasi, lakukan langkah-langkah pembersihan dan pertimbangkan langkah berikutnya.

Men-deploy dan memverifikasi aplikasi

Deploy ulang aplikasi Anda dengan gcloud app deploy dan konfirmasikan bahwa aplikasi berfungsi. Kode Anda sekarang seharusnya cocok dengan yang ada di FINISH, folder Modul 12. Outputnya harus sama dengan aplikasi Modul 1 yang Anda deploy sebelumnya:

a7a9d2b80d706a2b.png

Yang kami lakukan hanyalah mempercepat pengalaman pengguna untuk pengguna yang sama. Saat pengguna memuat ulang, Anda akan mendapatkan hasil langsung dari cache, yang tidak membuat kunjungan baru atau melakukan pengambilan Datastore.

Selamat, Anda telah menyelesaikan codelab Modul 12 untuk menambahkan penggunaan layanan memcache App Engine ke contoh aplikasi kita. Sekarang Anda memiliki opsi untuk mentransfer aplikasi Python 2 ini ke Python 3 di langkah bonus.

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:

  • Layanan Memcache App Engine hadir dalam dua jenis yang berbeda, masing-masing dengan struktur harga sendiri, sehingga Anda harus melacak penggunaan tersebut terkait dengan penagihan.
  • 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

Migrasi logis berikutnya yang perlu dipertimbangkan dibahas dalam Modul 13, yang menunjukkan cara bermigrasi dari layanan memcache App Engine ke Cloud Memorystore. Semua migrasi ini bersifat opsional dan tersedia bagi pengguna yang ingin melakukan berbagai langkah untuk memodernisasi aplikasi mereka. Layanan Cloud Memorystore adalah upgrade signifikan untuk memcache App Engine karena banyak alasan:

  • Cloud Memorystore bukan layanan tanpa server. Artinya, Anda harus mengalokasikan server untuk cache. Cloud Memorystore juga tidak memiliki paket gratis. Kedua faktor ini dapat berdampak signifikan pada biaya.
  • Cloud Memorystore mendukung sepasang mekanisme penyimpanan pokok yang berbeda (mesin caching), Redis dan Memcached.
  • Cloud Memorystore (untuk Redis) memiliki serangkaian fitur yang jauh lebih kaya dan mendalam daripada App Engine Memcache.
  • Untuk menggunakan Cloud Memorystore, Anda harus menyiapkan server Cloud Memorystore, menambahkannya ke jaringan VPC Google Cloud, lalu membuat aplikasi App Engine Anda menggunakan jaringan tersebut untuk berkomunikasi dengan server Memorystore Anda.

Jika Anda merasa tidak memerlukan semua fitur yang tersedia dari Cloud Memorystore atau khawatir tentang pengaruhnya terhadap biaya, Anda dapat tetap menggunakan App Engine Memcache.

Selain Modul 13, ada banyak kemungkinan migrasi lainnya seperti Cloud NDB dan Cloud Datastore, atau Cloud Tasks. Ada juga migrasi lintas produk ke Cloud Run dan Cloud Functions. Anda dapat menemukan semuanya di repo migrasi.

Langkah berikutnya yang mungkin adalah melakukan porting ke Python 3, yang dibahas di bagian berikutnya sebagai langkah opsional.

7. BONUS: Migrasi ke Python 3

Ringkasan

Bagian ini terdiri dari konten bonus opsional yang memigrasikan aplikasi Modul 12 yang baru saja kita selesaikan di atas ke Python 3. Kita mulai dengan konfigurasi, lalu aplikasi.

Menyederhanakan app.yaml

Salah satu manfaat runtime Python 3 adalah app.yaml dapat disederhanakan secara signifikan.

SEBELUM:

Berikut adalah isi app.yaml di akhir Modul 12:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

Karena runtime Python 3 mengharuskan framework web melakukan peruteannya sendiri, semua pengendali rute di app.yaml harus diubah menjadi auto. Jika tidak ada file statis yang ditayangkan, pengguna dapat menghapus seluruh bagian handlers:. Selain itu, threadsafe dan api_version tidak digunakan lagi.

SETELAH:

Dengan perubahan yang diperlukan seperti yang baru saja dijelaskan, berikut adalah penggantian app.yaml untuk Python 3:

runtime: python39
app_engine_apis: true

Satu-satunya baris yang memerlukan penjelasan adalah app_engine_apis: true. Saat layanan App Engine lama tersedia untuk runtime generasi kedua pada tahun 2021, beberapa runtime, termasuk Python 3, memerlukan bootstrapping tambahan untuk mengakses API tersebut seperti ndb, taskqueue, dan memcache. Baris ini dalam konfigurasi berfungsi untuk tujuan tersebut.

Perbarui requirements.txt

Bootstrapping API asli lainnya diperlukan di requirements.txt: akses ke App Engine SDK baru harus disertakan.

SEBELUM:

Berikut adalah isi app.yaml di akhir Modul 12:

flask

SETELAH:

Cukup tambahkan App Engine Python SDK, dan Anda akan memiliki hal berikut:

flask
appengine-python-standard

Menghapus appengine_config.py dan lib

Runtime App Engine generasi berikutnya mengubah penggunaan paket pihak ketiga:

  • Library bawaan adalah library yang diperiksa oleh Google dan tersedia di server App Engine, kemungkinan karena berisi kode C/C++ yang tidak diizinkan untuk di-deploy ke cloud oleh developer. Library ini tidak lagi tersedia di runtime generasi ke-2.
  • Penyalinan library non-bawaan (terkadang disebut "vendoring" atau "self-bundling") tidak lagi diperlukan di runtime generasi ke-2. Sebagai gantinya, library tersebut harus dicantumkan di requirements.txt tempat sistem build menginstalnya secara otomatis untuk Anda pada waktu deployment.

Sebagai hasil dari perubahan pada pengelolaan paket pihak ketiga tersebut, file appengine_config.py maupun folder lib tidak diperlukan, jadi hapus keduanya. Di runtime generasi ke-2, App Engine otomatis menginstal paket pihak ketiga yang tercantum di requirements.txt. Merangkum:

  1. Tidak ada library pihak ketiga yang di-bundle sendiri atau disalin; cantumkan di requirements.txt
  2. Tidak ada pip install dalam folder lib, artinya tidak ada periode folder lib
  3. Tidak ada pencantuman library pihak ketiga bawaan (sehingga tidak ada bagian libraries) di app.yaml; cantumkan di requirements.txt
  4. Tidak ada library pihak ketiga yang dirujuk dari aplikasi Anda berarti tidak ada file appengine_config.py

Mencantumkan semua library pihak ketiga yang diinginkan di requirements.txt adalah satu-satunya persyaratan developer.

Mengupdate aplikasi untuk menggunakan SDK App Engine

Seperti yang disebutkan di atas, aplikasi Python 3 memerlukan beberapa modifikasi untuk mengakses layanan paket App Engine:

  1. Bundel App Engine SDK (di requirements.txt)
  2. Aktifkan App Engine SDK (di app.yaml)
  3. Gabungkan objek WSGI (di main.py)

Pasangan pertama telah diselesaikan di atas, jadi persyaratan terakhir adalah memperbarui main.py.

SEBELUM:

Berikut adalah main.py Python 2 di akhir Modul 12:

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

app = Flask(__name__)
HOUR = 3600

SETELAH:

Untuk port Python 3, impor SDK dan bungkus objek aplikasi Flask dengannya (wrapper SDK), sehingga menghasilkan kode berikut:

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

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600

Developer perlu melakukan perubahan ini pada aplikasi Python mereka saat melakukan porting dari 2.x ke 3.x untuk mengakses layanan paket. Jika Anda tidak menggunakan Flask, ada juga contoh Django dan Pyramid dalam dokumen. Jika kode Python 2 Anda bukan aplikasi web, cukup sertakan paket SDK saat mentransfer ke Python 3. Kode aplikasi kami awalnya dibuat untuk berfungsi di Python 2 dan 3, sehingga tidak ada perubahan kompatibilitas tambahan yang diperlukan.

Men-deploy aplikasi

Setelah menyelesaikan perubahan di atas, Anda dapat men-deploy aplikasi contoh yang telah diupdate. (Tidak ada masalah saat men-deploy aplikasi versi Python 3 di atas aplikasi versi Python 2 asli dalam project GCP yang sama.) Perilaku aplikasi akan tetap sama. Jika Anda perlu membandingkan aplikasi yang telah diperbarui dengan aplikasi kami, lihat folder Modul 12b di repo migrasi. Untuk mempelajari lebih lanjut dukungan layanan paket App Engine di runtime terbaru seperti Python 3, lihat pengumuman peluncuran fitur serta codelab Modul 17.

Selamat, Anda telah menyelesaikan langkah bonus di Modul 12! Lihat juga dokumentasi tentang menyiapkan file konfigurasi untuk runtime Python 3. Tinjau bagian Ringkasan/Pembersihan di atas untuk mengetahui langkah dan pembersihan berikutnya.

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 2 (START) dan Modul 12 (FINISH) dapat ditemukan pada tabel di bawah. Link tersebut juga dapat diakses dari repo untuk semua migrasi codelab App Engine yang dapat Anda clone atau download file ZIP.

Codelab

Python 2

Python 3

Modul 1

kode

code (tidak ditampilkan dalam tutorial ini)

Modul 12 (codelab ini)

kode

kode

Referensi online

Berikut adalah referensi online yang mungkin relevan untuk tutorial ini:

App Engine

Cloud Memorystore dan Cloud Datastore

Informasi Cloud lainnya

Video

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.