Membuat koneksi persisten dengan WebSockets

Anda dapat menggunakan WebSocket untuk membuat koneksi persisten dari klien (seperti perangkat seluler atau komputer) ke instance App Engine. Dengan koneksi terbuka, pertukaran data dua arah antara klien dan server dapat dilakukan kapan saja, sehingga menghasilkan latensi yang lebih rendah dan penggunaan resource yang lebih baik.

WebSockets

Protokol WebSockets, yang didefinisikan dalam RFC 6455, menyediakan saluran komunikasi full-duplex antara klien dan server. Saluran dimulai dari permintaan HTTP(S) dengan header "upgrade".

Kasus penggunaan umum untuk WebSocket meliputi:

  • Info terbaru peristiwa real time, seperti feed media sosial, skor olahraga, berita, atau harga pasar saham
  • Notifikasi pengguna, seperti update konten atau software
  • Aplikasi chat
  • Alat pengeditan kolaboratif
  • Game multiplayer

WebSocket selalu tersedia untuk aplikasi Anda tanpa penyiapan tambahan. Setelah koneksi WebSocket tersambung, waktu akan habis setelah satu jam. Penggunaan WebSocket ditagih berdasarkan penggunaan koneksi hingga waktu tunggu habis atau penghentian soket.

Menjalankan aplikasi contoh dengan WebSockets

Prasyarat dan penyiapan

Contoh kode dalam dokumen ini mendeskripsikan cara menjalankan aplikasi contoh dengan aplikasi menggunakan WebSockets untuk runtime Python versi 3.7 dan yang lebih lama. Untuk Python versi 3.8 dan yang lebih baru, lihat runtime Python untuk informasi selengkapnya tentang penggunaan versi yang lebih baru.

Ikuti petunjuk di bagian Menyiapkan Lingkungan Pengembangan Anda untuk menyiapkan lingkungan dan project, serta untuk memahami struktur aplikasi.

Membuat clone aplikasi contoh

Salin aplikasi contoh ke komputer lokal Anda, lalu buka direktori websockets:

git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/flexible_python37_and_earlier/websockets/

Menjalankan contoh secara lokal

Untuk menjalankan secara lokal, Anda harus menggunakan Gunicorn dengan worker flask_socket:

$ gunicorn -b 127.0.0.1:8080 -k flask_sockets.worker main:app

Men-deploy dan menjalankan contoh di App Engine

Untuk men-deploy aplikasi Anda ke lingkungan fleksibel App Engine, jalankan perintah berikut dari direktori tempat app.yaml Anda berada:

gcloud app deploy

Kemudian, Anda dapat mengarahkan browser ke https://PROJECT_ID.REGION_ID.r.appspot.com

Afinitas sesi

Tidak semua klien mendukung WebSocket. Untuk mengatasi hal ini, banyak aplikasi menggunakan library seperti socket.io yang menggunakan polling http long dengan klien yang tidak mendukung WebSocket.

App Engine biasanya mendistribusikan permintaan secara merata di antara instance yang tersedia. Namun, saat menggunakan polling http long, beberapa permintaan berurutan dari pengguna tertentu harus mencapai instance yang sama.

Untuk mengizinkan App Engine mengirim permintaan oleh pengguna yang sama ke instance yang sama, Anda dapat mengaktifkan afinitas sesi. App Engine kemudian mengidentifikasi permintaan mana yang dikirim oleh pengguna yang sama dengan memeriksa cookie dan merutekan permintaan tersebut ke instance yang sama.

Afinitas sesi di App Engine diimplementasikan berdasarkan upaya terbaik. Saat mengembangkan aplikasi, Anda harus selalu mengasumsikan bahwa afinitas sesi tidak dijamin. Klien dapat kehilangan afinitas dengan instance target dalam skenario berikut:

  • Autoscaler App Engine dapat menambahkan atau menghapus instance yang menyajikan aplikasi Anda. Aplikasi dapat mengalokasikan ulang beban, dan instance target mungkin berpindah. Untuk meminimalkan risiko ini, pastikan Anda telah menetapkan jumlah minimum instance untuk menangani beban yang diharapkan.
  • Jika instance target gagal dalam health check, App Engine akan memindahkan sesi ke instance yang responsif. Untuk mengetahui informasi selengkapnya tentang health check dan opsi penyesuaiannya, lihat Memisahkan health check.
  • Afinitas sesi hilang saat instance dimulai ulang untuk pemeliharaan atau update software. Instance VM lingkungan fleksibel App Engine dimulai ulang setiap minggu.

Karena afinitas sesi tidak dijamin, Anda hanya boleh menggunakannya untuk memanfaatkan kemampuan socket.io dan library lainnya untuk menggunakan polling HTTP long jika koneksi terputus. Anda tidak boleh menggunakan afinitas sesi untuk membangun aplikasi stateful.

Mengaktifkan dan menonaktifkan afinitas sesi

Secara default, afinitas sesi dinonaktifkan untuk semua aplikasi App Engine. Afinitas sesi ditetapkan pada tingkat versi aplikasi dan dapat diaktifkan atau dinonaktifkan pada saat deployment.

Guna mengaktifkan afinitas sesi untuk versi App Engine Anda, tambahkan entri berikut ke file app.yaml Anda:

network:
  session_affinity: true

Setelah versi di-deploy dengan app.yaml yang telah diupdate, permintaan baru akan mulai disajikan dari instance yang sama selama instance tersebut tersedia.

Untuk menonaktifkan afinitas sesi, hapus entri dari file app.yaml Anda, atau tetapkan nilainya ke salah (false):

network:
  session_affinity: false