Memigrasikan Memcache ke Memorystore

Aplikasi web Python yang skalabel dan berperforma tinggi sering kali menggunakan cache data dalam memori yang terdistribusi, bukan penyimpanan persisten yang kuat untuk beberapa tugas.

Solusi App Engine untuk hal ini adalah Memcache, datastore dalam memori terdistribusi yang digunakan sebagai cache untuk tugas tertentu.

Saat bermigrasi dari layanan paket lama, pengganti yang direkomendasikan untuk Memcache App Engine adalah Memorystore, layanan caching berbasis cloud yang terkelola sepenuhnya dan mendukung mesin cache open source, Redis dan Memcache. Panduan ini membahas penggunaan Memorystore for Redis, yang dapat membuat cache aplikasi yang menyediakan akses data sub-milidetik.

Jika aplikasi Python Anda menggunakan Memcache hanya untuk mengurangi latensi untuk permintaan ndb atau Cloud NDB, Anda dapat menggunakan dukungan bawaan Cloud NDB untuk Redis, bukan Memcache atau Memorystore for Redis.

Sebelum memulai, pastikan aplikasi Anda tidak melebihi kuota Memorystore for Redis.

Kapan harus menggunakan cache memori untuk aplikasi Python

Di aplikasi Python Anda, data sesi, preferensi pengguna, dan data lain yang ditampilkan oleh kueri untuk halaman web merupakan kandidat yang baik untuk disimpan dalam cache. Secara umum, jika kueri yang sering dijalankan menampilkan kumpulan hasil yang tidak perlu segera muncul di aplikasi, Anda dapat meng-cache hasilnya. Permintaan berikutnya dapat memeriksa cache dan hanya membuat kueri database jika hasilnya tidak ada atau sudah tidak berlaku.

Jika Anda hanya menyimpan nilai di Memorystore tanpa mencadangkannya di penyimpanan persisten, pastikan aplikasi Anda berperilaku dapat diterima jika nilainya sudah tidak berlaku dan dihapus dari cache. Misalnya, jika ketiadaan data sesi pengguna secara tiba-tiba akan menyebabkan sesi gagal berfungsi, data tersebut mungkin harus disimpan dalam database selain Memorystore.

Sebelum memulai

Jika Anda belum melakukannya, siapkan lingkungan pengembangan Python Anda untuk menggunakan versi Python yang kompatibel dengan Google Cloud, dan instal alat pengujian untuk membuat lingkungan Python yang terisolasi.

Memahami izin Memorystore

Setiap interaksi dengan layanan Google Cloud perlu diotorisasi. Misalnya, untuk berinteraksi dengan database Redis yang dihosting oleh Memorystore, aplikasi Anda harus menyediakan kredensial akun yang diotorisasi untuk mengakses Memorystore.

Secara default, aplikasi Anda memberikan kredensial akun layanan default App Engine, yang diberi otorisasi untuk mengakses database dalam project yang sama dengan aplikasi Anda.

Jika salah satu kondisi berikut terpenuhi, Anda harus menggunakan teknik autentikasi alternatif yang secara eksplisit memberikan kredensial:

  • Aplikasi Anda dan database Memorystore berada di project Google Cloud yang berbeda.

  • Anda telah mengubah peran yang ditetapkan ke akun layanan App Engine default.

Untuk mengetahui informasi tentang teknik autentikasi alternatif, baca artikel Menyiapkan Autentikasi untuk Aplikasi Produksi Server ke Server.

Ringkasan proses migrasi

Untuk menggunakan Memorystore, bukan Memcache di aplikasi Python Anda:

  1. Siapkan Memorystore for Redis, yang mengharuskan Anda untuk membuat instance Redis di Memorystore dan membuat Akses VPC Serverless yang digunakan aplikasi Anda untuk berkomunikasi dengan instance Redis. Urutan pembuatan dua entity independen ini tidak wajib diikuti dan dapat disiapkan dalam urutan apa pun. Petunjuk dalam panduan ini menunjukkan penyiapan Akses VPC Serverless terlebih dahulu.

  2. Instal library klien untuk Redis dan gunakan perintah Redis untuk menyimpan data dalam cache.

    Memorystore for Redis kompatibel dengan library klien apa pun untuk Redis.

    Panduan ini menjelaskan penggunaan library klien redis-py untuk mengirim perintah Redis dari aplikasi Anda.

  3. Uji pembaruan Anda.

  4. Deploy aplikasi Anda ke App Engine.

Menyiapkan Memorystore for Redis

Untuk menyiapkan Memorystore for Redis:

  1. Hubungkan App Engine Anda ke jaringan VPC. Aplikasi Anda hanya dapat berkomunikasi dengan Memorystore melalui konektor VPC.

    Pastikan untuk menambahkan informasi koneksi VPC ke file app.yaml Anda, seperti yang dijelaskan dalam Mengonfigurasi aplikasi menggunakan konektor.

  2. Catat alamat IP dan nomor port instance Redis yang Anda buat. Anda akan menggunakan informasi ini saat membuat klien Redis dalam kode.

  3. Buat instance Redis di Memorystore.

    Saat diminta memilih region instance Redis, pilih region yang sama dengan tempat aplikasi App Engine Anda berada.

Menginstal dependensi

Untuk menggunakan library klien redis-py:

  1. Perbarui file app.yaml. Ikuti petunjuk untuk versi Python Anda:

    Python 2

    Untuk aplikasi Python 2, tambahkan versi terbaru library grpcio dan setuptools.

    Berikut adalah contoh file app.yaml:

    runtime: python27
    threadsafe: yes
    api_version: 1
    
    libraries:
    - name: grpcio
      version: latest
    - name: setuptools
      version: latest
    

    Python 3

    Untuk aplikasi Python 3, tentukan elemen runtime di file app.yaml dengan versi Python 3 yang didukung. Contoh:

    runtime: python310 # or another support version
    

    Runtime Python 3 menginstal library secara otomatis, sehingga Anda tidak perlu menentukan library bawaan dari runtime Python 2 sebelumnya. Jika aplikasi Python 3 Anda menggunakan layanan paket lama lainnya saat bermigrasi, Anda dapat terus menentukan library bawaan yang diperlukan. Jika tidak, Anda dapat menghapus baris yang tidak diperlukan dalam file app.yaml.

  2. Perbarui file requirements.txt. Ikuti petunjuk untuk versi python Anda:

    Python 2

    Tambahkan Library Klien Cloud untuk Memorystore for Redis ke daftar dependensi Anda dalam file requirements.txt.

    redis
    

    Jalankan pip install -t lib -r requirements.txt untuk memperbarui daftar library yang tersedia untuk aplikasi Anda.

    Python 3

    Tambahkan Library Klien Cloud untuk Memorystore for Redis ke daftar dependensi Anda dalam file requirements.txt.

    redis
    

    App Engine otomatis menginstal dependensi ini selama deployment aplikasi di runtime Python 3, jadi hapus folder lib jika ada.

  3. Untuk aplikasi Python 2, jika aplikasi Anda menggunakan library bawaan atau yang disalin yang ditentukan dalam direktori lib, Anda harus menentukan jalur tersebut di file appengine_config.py, yang terletak di folder yang sama dengan file app.yaml Anda:

    import pkg_resources
    from google.appengine.ext import vendor
    
    # Set PATH to your libraries folder.
    PATH = 'lib'
    # Add libraries installed in the PATH folder.
    vendor.add(PATH)
    # Add libraries to pkg_resources working set to find the distribution.
    pkg_resources.working_set.add_entry(PATH)
    

Membuat klien Redis

Untuk berinteraksi dengan database Redis, kode Anda perlu membuat klien Redis untuk mengelola koneksi ke database Redis. Bagian berikut menjelaskan pembuatan klien Redis menggunakan library klien redis-py.

Menentukan variabel lingkungan

Library klien redis-py menggunakan dua variabel lingkungan untuk menyusun URL database Redis Anda:

  • Variabel untuk mengidentifikasi alamat IP database Redis yang Anda buat di Memorystore.
  • Variabel untuk mengidentifikasi nomor port database Redis yang Anda buat di Memorystore.

Sebaiknya tentukan variabel ini dalam file app.yaml aplikasi, bukan menentukannya secara langsung di dalam kode. Cara ini memudahkan Anda untuk menjalankan aplikasi di lingkungan yang berbeda, seperti lingkungan lokal dan App Engine.

Misalnya, tambahkan baris berikut ke file app.yaml Anda:

 env_variables:
      REDISHOST: '10.112.12.112'
      REDISPORT: '6379'

Mengimpor redis-py dan membuat klien

Setelah Anda menentukan variabel lingkungan REDISHOST dan REDISPORT, gunakan baris berikut untuk mengimpor library redis-py dan membuat klien:

  import redis

  redis_host = os.environ.get('REDISHOST', 'localhost')
  redis_port = int(os.environ.get('REDISPORT', 6379))
  redis_client = redis.Redis(host=redis_host, port=redis_port)

Jika menggunakan versi lama redis-py untuk aplikasi lain, Anda mungkin menggunakan class StrictClient, bukan Client. Namun, redis-py sekarang merekomendasikan Client, bukan StrictClient.

Menggunakan perintah Redis untuk menyimpan dan mengambil data dalam cache

Meskipun database Memorystore Redis mendukung sebagian besar perintah Redis, Anda hanya perlu menggunakan beberapa perintah untuk menyimpan dan mengambil data dari cache. Tabel berikut menampilkan rekomendasi perintah Redis yang dapat Anda gunakan untuk menyimpan data ke dalam cache. Untuk mengetahui cara memanggil perintah ini dari aplikasi Anda, lihat dokumentasi library klien.

Perhatikan bahwa untuk aplikasi Python 2, meskipun Memcache menyediakan alternatif asinkron untuk banyak perintahnya, library klien redis-py tidak selalu menyediakan metode asinkron yang setara. Jika Anda mengharuskan semua interaksi dengan cache bersifat asinkron, library klien Redis lainnya untuk Python tersedia.

Tugas Perintah Redis
Buat entri dalam cache data dan
tetapkan waktu habis masa berlaku untuk entri
SETNX
MSETNX
Mengambil data dari cache GET
MGET
Mengganti nilai cache yang ada SETEL
MSET
Menambahkan atau mengurangi nilai cache numerik INCR
INCRBY
DECR
DECRBY
Menghapus entri dari cache DEL
UNLINK
Mendukung interaksi serentak dengan cache (bandingkan dan tetapkan) Lihat detail tentang transaksi Redis. Perhatikan bahwa library klien `redis-py` mengharuskan semua transaksi terjadi di pipeline.

Menguji update Anda

Saat Anda menguji aplikasi secara lokal, pertimbangkan untuk menjalankan instance lokal Redis gun menghindari interaksi dengan data produksi (Memorystore tidak menyediakan emulator). Untuk menginstal dan menjalankan Redis secara lokal, ikuti petunjuk dalam dokumentasi Redis. Perhatikan bahwa saat ini menjalankan Redis secara lokal di Windows tidak dapat dilakukan.

Untuk informasi selengkapnya tentang menguji aplikasi Python, lihat Menggunakan server pengembangan lokal.

Men-deploy aplikasi Anda

Setelah aplikasi Anda berjalan di server pengembangan lokal tanpa error:

  1. Uji aplikasi di App Engine.

  2. Jika aplikasi berjalan tanpa error, gunakan pemisahan traffic untuk meningkatkan traffic aplikasi yang diupdate secara perlahan. Pantau aplikasi dengan cermat untuk menemukan masalah database sebelum mengarahkan lebih banyak traffic ke aplikasi yang telah diupdate.

Langkah selanjutnya