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

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

Anda akan mempelajari cara

  • Menggunakan library/Library Memcache App Engine
  • Menambahkan cache 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 Memcache App Engine, tambahkan penggunaannya ke aplikasi NDB Flask dan App Engine yang ada yang dihasilkan dari codelab Modul 1. Aplikasi contoh menampilkan sepuluh kunjungan terbaru kepada pengguna. Jika pengguna yang sama me-refresh browser, membuat entity Kunjungan baru tidak optimal dan mengambil kunjungan terbaru dari Datastore, sehingga kita akan menyimpan kunjungan terbaru tersebut ke dalam cache.

Jika pengunjung yang sama membuka halaman, kunjungan tersebut akan ditampilkan dari cache. Jika pengguna baru mengunjungi situs atau satu jam telah berlalu, {i>cache<i} akan dibersihkan dan diganti dengan entri terbaru (belum termasuk Kunjungan baru yang didaftarkan). Setelah menerapkan integrasi Memcache App Engine ini, kita dapat memigrasikannya ke Cloud Memorystore di codelab berikutnya (Modul 13).

Tutorial ini menampilkan langkah-langkah berikut:

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

3. Penyiapan/Prakerja

Sebelum masuk 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 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 contoh Modul 1 yang berfungsi. Jika Anda tidak memilikinya, selesaikan salah satu tutorial (tautan di atas) sebelum melanjutkan ke sini. Atau, jika Anda sudah terbiasa dengan kontennya, Anda dapat 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 memandu Anda melalui setiap langkah, yang diakhiri dengan kode yang menyerupai yang ada di folder repo Modul 11 (FINISH).

Direktori file STARTing Modul 1 (milik Anda atau milik 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 mirip di bawah ini), Anda siap untuk menambahkan penggunaan caching ke aplikasi.

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 paling penting adalah mengimpor library Memcache, google.appengine.api.memcache. Karena kita akan meng-cache kunjungan terbaru selama satu jam, mari kita tambahkan juga konstanta untuk jumlah detik dalam satu jam. Berikut adalah tampilan kode Anda sebelumnya dan 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 caching dengan dukungan Memcache

Perubahan yang paling signifikan adalah menambahkan penggunaan cache di aplikasi kita. Lebih khusus lagi, kita harus meng-cache kunjungan terbaru, memeriksa untuk melihat apakah kunjungan yang di-cache tersedia, dan berupaya menggunakan hasil yang di-cache sebanyak mungkin berdasarkan rencana kita. Berikut adalah langkah-langkah yang akan diambil aplikasi untuk mencapai tujuan kita:

  1. Tetapkan kunjungan saat ini dan sebut visitor
  2. Upaya untuk 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. Tampilkan visits kepada pengguna melalui template web

Berikut informasi sebelum dan sesudah 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

Contoh ini mengakhiri semua perubahan yang diperlukan untuk menambahkan penggunaan App Engine memcache ke aplikasi contoh Modul 1. Mari kita bangun dan deploy aplikasi ini untuk melihat hasilnya.

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 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. Output harus sama dengan aplikasi Modul 1 yang Anda deploy sebelumnya:

a7a9d2b80d706a2b.png

Semua yang kami lakukan adalah mempercepat pengalaman pengguna untuk pengguna yang sama. Saat dimuat ulang, Anda akan mendapatkan hasilnya langsung dari cache, yang tidak akan membuat kunjungan baru maupun melakukan pengambilan Datastore.

Selamat, Anda telah menyelesaikan codelab Modul 12 karena telah menambahkan penggunaan layanan memcache App Engine ke aplikasi contoh kami. Anda sekarang memiliki opsi untuk mem-port aplikasi Python 2 ini ke Python 3 pada langkah bonus.

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 Memcache App Engine hadir dalam dua ragam yang berbeda, masing-masing dengan struktur harga sendiri, jadi Anda harus melacak penggunaan tersebut dalam kaitannya 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 tercakup dalam Modul 13, yang menunjukkan kepada developer 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 yang signifikan ke memcache App Engine karena berbagai alasan:

  • Cloud Memorystore bukan serverless. Ini berarti Anda harus mengalokasikan server untuk {i>cache<i}. Cloud Memorystore juga tidak memiliki paket gratis. Kedua faktor ini dapat memiliki dampak yang signifikan terhadap biaya.
  • Cloud Memorystore mendukung sepasang mekanisme penyimpanan dasar yang berbeda (mesin caching), Redis, dan Memcached.
  • Cloud Memorystore (for Redis) memiliki set fitur yang jauh lebih kaya dan lebih mendalam daripada Memcache App Engine.
  • Untuk menggunakan Cloud Memorystore, Anda harus menyiapkan server Cloud Memorystore, menambahkannya ke jaringan VPC Google Cloud, lalu aplikasi App Engine Anda menggunakan jaringan tersebut untuk berkomunikasi dengan server Memorystore.

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

Di luar Modul 13, terdapat banyak kemungkinan migrasi lain, seperti Cloud NDB dan Cloud Datastore, atau Cloud Tasks. Migrasi lintas produk juga berlaku untuk Cloud Run dan Cloud Functions. Anda akan menemukan semuanya di repositori migrasi.

Langkah lain yang mungkin dilakukan adalah melakukan porting ke Python 3, yang dibahas di bagian selanjutnya 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 diikuti dengan 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 memerlukan framework web untuk melakukan peruteannya sendiri, semua pengendali rute di app.yaml harus diubah menjadi auto. Jika tidak ada file statis yang ditayangkan, pengguna dapat langsung menghapus seluruh bagian handlers:. Selain itu, threadsafe dan api_version tidak digunakan lagi.

SETELAH:

Dengan perubahan yang diperlukan yang baru saja dijelaskan, ini adalah pengganti 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 bootstrap tambahan untuk mengakses API tersebut seperti ndb, taskqueue, dan memcache. Baris dalam konfigurasi ini digunakan untuk tujuan tersebut.

Perbarui requirements.txt

Bootstrap lain dari API asli 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 kode 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 oleh developer ke cloud. Library ini tidak lagi tersedia di runtime generasi ke-2.
  • Menyalin library non-bawaan (terkadang disebut "vendor" atau "bundling mandiri") tidak lagi diperlukan dalam runtime generasi ke-2. Sebaliknya, aplikasi tersebut akan tercantum di requirements.txt tempat sistem build menginstalnya secara otomatis atas nama Anda pada waktu deployment.

Akibat perubahan pada pengelolaan paket pihak ketiga tersebut, file appengine_config.py atau folder lib tidak diperlukan, jadi hapus file tersebut. Pada runtime generasi ke-2, App Engine menginstal paket pihak ketiga secara otomatis yang tercantum di requirements.txt. Merangkum:

  1. Tidak ada library pihak ketiga yang dipaketkan sendiri atau disalin; cantumkan di requirements.txt
  2. Tidak ada pip install dalam folder lib, artinya tidak ada periode folder lib
  3. Tidak ada listingan library pihak ketiga bawaan (sehingga tidak ada bagian libraries) di app.yaml; cantumkan di requirements.txt
  4. Tidak ada library pihak ketiga yang menjadi referensi dari aplikasi Anda, artinya 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. Paket SDK App Engine (di requirements.txt)
  2. Aktifkan App Engine SDK (di app.yaml)
  3. Menggabungkan objek WSGI (di main.py)

Penyambungan pertama telah diselesaikan di atas, sehingga persyaratan terakhir adalah memperbarui main.py.

SEBELUM:

Berikut adalah Python 2 main.py 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 gabungkan objek aplikasi Flask dengannya (Wrapper SDK), sehingga menghasilkan hal 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 transfer dari 2.x ke 3.x untuk mengakses layanan yang dipaketkan. Jika Anda tidak menggunakan Flask, ada juga contoh Django dan Pyramid di dokumen. Jika kode Python 2 Anda bukan aplikasi web, menyertakan paket SDK saja sudah cukup saat melakukan porting ke Python 3. Kode aplikasi kita awalnya dibuat untuk berfungsi di Python 2 dan 3, sehingga tidak diperlukan perubahan kompatibilitas tambahan.

Men-deploy aplikasi

Setelah menyelesaikan perubahan di atas, Anda dapat men-deploy aplikasi contoh yang telah diupdate. (Tidak ada masalah saat men-deploy versi Python 3 aplikasi Anda pada versi Python 2 asli pada project GCP yang sama.) Perilaku aplikasi harus tetap sama. Jika Anda perlu membandingkan aplikasi yang diupdate dengan aplikasi kami, lihat folder Modul 12b di repo migrasi. Untuk mempelajari lebih lanjut dukungan layanan paket App Engine pada 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 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 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 {i>online<i}

Di bawah ini 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.