Saat Anda menghapus server backend atau server tersebut gagal dalam pemeriksaan kesehatan, koneksi yang telah terbentuk tidak langsung dihentikan. Koneksi persisten ini dapat mengganggu shutdown layanan yang mulus atau menyebabkan error permintaan. Untuk menghindarinya, gunakan fitur connection draining Application Load Balancer (ALB). Saat server backend dihapus atau menjadi tidak sehat, connection draining memungkinkan koneksi yang ada tetap diproses selama periode yang telah dikonfigurasi. Setelah periode tersebut berakhir, ALB secara aktif menutup koneksi tersebut, sehingga memastikan shutdown layanan yang mulus.
Kasus penggunaan
Gunakan connection draining dalam dua skenario berikut.
Menghapus server backend: Sebelum menghapus server backend, atur timeout connection draining yang lebih lama agar permintaan yang sedang berjalan dapat diselesaikan.
Kegagalan pemeriksaan kesehatan: Saat server backend gagal dalam pemeriksaan kesehatan, atur timeout yang lebih singkat untuk memutus koneksi bermasalah dengan cepat dan mencegah client mengalami error.
Karena kedua skenario tersebut menggunakan fitur connection draining yang sama, Anda perlu mengatur timeout connection draining sesuai dengan kebutuhan bisnis spesifik Anda.
Skenario 1: Menghapus server backend
Topik ini menggunakan skenario yang ditunjukkan pada gambar berikut. Saat Anda menghapus server backend ECS01, ALB berhenti mengirim permintaan baru ke server tersebut. ECS01 kemudian hanya memproses permintaan yang sedang berjalan dan tidak menerima permintaan baru.
Jika connection draining dinonaktifkan, koneksi ke ECS01 akan diputus secara tiba-tiba, yang dapat mengganggu permintaan yang sedang berjalan.
Jika connection draining diaktifkan dan timeout telah diatur:
Jika server backend ECS01 memiliki permintaan yang sedang berjalan, ALB akan menutup koneksi yang ada di ECS01 saat timeout connection draining tercapai.
Jika server backend ECS01 tidak memiliki permintaan yang sedang berjalan atau koneksi aktif, ALB langsung menyelesaikan proses penghapusan tanpa menunggu timeout connection draining berakhir.
Jika server backend ECS01 masih memproses permintaan saat timeout connection draining tercapai, koneksi tersebut akan dihentikan. Client kemudian menerima respons error tingkat 500. Misalnya, jika timeout connection draining diatur menjadi 15 detik tetapi permintaan memerlukan waktu 30 detik untuk diproses, koneksi akan dihentikan sebelum ECS01 dapat mengirim respons. Dalam kasus ini, client menerima respons error tingkat 500.
CatatanJika Anda menambahkan kembali ECS01 ke grup server setelah menghapusnya, proses draining untuk koneksi pada instans yang dihapus tidak terpengaruh. Statusnya tetap tidak berubah: hanya memproses permintaan yang sedang berjalan dan tidak menerima yang baru. ALB akan menutup koneksi yang ada di ECS01 saat timeout connection draining tercapai.
Gambar berikut menunjukkan transisi status ECS01 setelah dihapus dari grup server tempat connection draining diaktifkan.
Skenario 2: Kegagalan pemeriksaan kesehatan
Saat server backend ECS01 gagal dalam pemeriksaan kesehatan, ALB berhenti mengirim permintaan baru ke server tersebut. Pada titik ini, ECS01 hanya memproses permintaan yang sedang berjalan dan tidak menerima yang baru.
Jika connection draining dinonaktifkan, ECS01 tetap dalam status ini hingga lulus pemeriksaan kesehatan lagi, saat itu server akan mulai menerima permintaan baru.
Jika connection draining diaktifkan dan timeout telah diatur:
ALB menutup koneksi yang ada di ECS01 saat timeout connection draining tercapai.
Jika grup server diperbarui (misalnya, konfigurasi ECS01 diubah), status koneksi ECS01 tidak berubah. Server tersebut terus hanya memproses permintaan yang sedang berjalan dan tidak menerima yang baru. Bahkan jika ECS01 lulus pemeriksaan kesehatan setelah pembaruan, ALB tetap menutup koneksi yang ada di ECS01 saat timeout connection draining tercapai.
CatatanSaat ALB menutup koneksi yang ada di ECS01 setelah timeout connection draining tercapai, ECS01 dapat menerima permintaan baru jika lulus pemeriksaan kesehatan. Jika gagal dalam pemeriksaan kesehatan, ECS01 tidak menerima permintaan baru.
Connection draining tidak dipicu jika kegagalan pemeriksaan kesehatan disebabkan oleh pembaruan konfigurasi. Sistem hanya memulai connection draining untuk kegagalan pemeriksaan kesehatan yang disebabkan oleh masalah layanan backend.
Gambar berikut menunjukkan transisi status ECS01 setelah gagal dalam pemeriksaan kesehatan.
Anda dapat mengonfigurasi connection draining berdasarkan skenario bisnis Anda. Topik ini menggunakan Skenario 1: Menghapus server backend sebagai contoh dan menunjukkan bagaimana ALB mengganggu session WebSocket dan HTTP.
Catatan penggunaan
Hanya instans ALB Standard dan yang diaktifkan WAF yang mendukung connection draining. Instans ALB Basic tidak mendukung fitur ini.
Grup server bertipe Function Compute tidak mendukung connection draining.
Anda dapat mengaktifkan connection draining saat menggunakan protokol WebSocket. Dalam skenario HTTP, permintaan memiliki batas timeout. Kami merekomendasikan agar Anda mengatur timeout connection draining ke nilai yang lebih besar daripada timeout permintaan koneksi instans ALB untuk mencegah permintaan HTTP dihentikan sebelum waktunya. Timeout connection draining default yang diatur oleh ALB sudah lebih besar daripada timeout permintaan koneksi. Untuk informasi lebih lanjut tentang cara mengatur timeout permintaan koneksi, lihat Tambahkan pendengar HTTP.
Prasyarat
Anda telah membuat instans ALB Standard atau yang diaktifkan WAF dan grup server bertipe Server untuk instans tersebut. Topik ini menggunakan instans ALB Standard sebagai contoh. Untuk informasi lebih lanjut, lihat Buat dan kelola instans ALB dan Buat dan kelola grup server.
Anda telah mengonfigurasi pendengar HTTP untuk instans ALB pada port
80dan mengaitkan pendengar tersebut dengan grup server. Untuk informasi lebih lanjut, lihat Tambahkan pendengar HTTP.Anda telah membuat dua server backend: ECS01 dan ECS02. Untuk informasi lebih lanjut, lihat Buat instans menggunakan wizard.
Anda telah menambahkan instans ECS02 ke grup server, dan client dapat mengakses layanan yang berjalan di ECS02. Untuk informasi lebih lanjut, lihat Gunakan ALB untuk mencapai load balancing layanan IPv4 dan Gunakan ALB untuk mencapai load balancing layanan IPv6.
CatatanTopik ini menggunakan sistem operasi Alibaba Cloud Linux 3.2104 64-bit untuk client. Pastikan Python telah diinstal pada client dan server backend ECS01 Anda. Jika Python belum diinstal pada sistem operasi Anda, lihat situs resmi Python untuk instruksi instalasi. Topik ini menggunakan Python 3.x sebagai contoh.
Dalam topik ini, server backend ECS02 menjalankan layanan representatif. Jika Anda sudah memiliki server serupa, Anda tidak perlu membuat yang baru.
Prosedur
Topik ini menunjukkan bagaimana ALB, dengan connection draining diaktifkan, menangani permintaan WebSocket dan HTTP.
Perilaku gangguan session WebSocket
Langkah 1: Aktifkan connection draining
Langkah ini menjelaskan cara mengaktifkan connection draining untuk grup server dari prasyarat. Anda juga dapat mengaktifkan fitur ini saat membuat grup server.
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat grup server dideploy.
Di panel navigasi kiri, pilih .
Pada halaman Server Groups, temukan grup server target dan klik ID-nya.
Pada tab Details, temukan bagian Basic Information dan klik Modify Basic Information.
Pada dialog Modify Basic Information, klik Advanced Settings, lalu aktifkan Connection Draining.
Atur Timeout Period menjadi 300 detik dan klik Save.
Langkah 2: Verifikasi hasil
Konfigurasi server
Masuk ke instans ECS01. Untuk informasi lebih lanjut, lihat Metode koneksi.
Jalankan perintah berikut untuk membuat direktori bernama WebSocket dan masuk ke direktori tersebut.
mkdir WebSocket cd WebSocketJalankan perintah berikut untuk menginstal dependensi yang diperlukan.
pip install tornado pip install websocket-clientJalankan perintah berikut untuk mengedit file konfigurasi server.py.
vim server.pyTekan tombol
iuntuk memasuki mode edit dan tambahkan kode berikut untuk menjalankan layanan WebSocket.#!/usr/bin/env python3 # encoding=utf-8 import tornado.websocket import tornado.ioloop import tornado.web from datetime import datetime # WebSocket handler class WebSocketHandler(tornado.websocket.WebSocketHandler): def open(self): current_time = datetime.now() formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S") print("Time:", formatted_time, "WebSocket connection opened") def on_message(self, message): current_time = datetime.now() formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S") print("Time:", formatted_time, "Received message:", message) self.write_message("Server received your message: " + message) def on_close(self): current_time = datetime.now() formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S") print("Time:", formatted_time, "WebSocket connection closed") # Routing application = tornado.web.Application([ (r"/websocket", WebSocketHandler), ]) if __name__ == "__main__": print("WebSocket Server Start on 8080 ...") application.listen(8080) tornado.ioloop.IOLoop.current().start()Setelah mengubah konfigurasi, tekan tombol
Esc, ketik:wq, lalu tekan Enter untuk menyimpan dan menutup file.
Masuk ke direktori tempat server.py berada dan jalankan perintah berikut untuk menjalankan server WebSocket.
python3 server.pyRespons berikut menunjukkan bahwa layanan backend WebSocket telah dimulai.
Websocket Server Start on 8080 ...
Tambahkan server backend ECS01 ke grup server
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat grup server dideploy.
Di panel navigasi kiri, pilih .
Pada halaman Server Groups, temukan grup server target dan klik Modify Backend Server di kolom Actions.
Pada tab Backend Servers, klik Add Backend Server. Di panel Add Backend Server, pilih ECS01 dan klik Next.
Pada langkah Ports/Weights, pilih instans ECS01, atur port ke
8080, lalu klik OK.
Konfigurasi client
Masuk ke client dan buka antarmuka baris perintah. Jalankan perintah berikut untuk membuat direktori bernama WebSocket dan masuk ke direktori tersebut.
mkdir WebSocket cd WebSocketJalankan perintah berikut untuk menginstal dependensi yang diperlukan.
pip install websocket-clientJalankan perintah berikut untuk mengedit file client.py.
vim client.pyTekan tombol
iuntuk memasuki mode edit dan tambahkan kode berikut untuk client WebSocket agar dapat mengakses layanan.#!/usr/bin/env python3 # encoding=utf-8 import websocket import time from datetime import datetime def on_message(ws, message): print("Received message from server:", message) if __name__ == "__main__": ws = websocket.WebSocket() ws.connect("ws://<domain_name>:80/websocket") # Ganti <domain_name> dengan nama domain aktual Anda. print("WebSocket connection opened") try: while True: current_time = datetime.now() formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S") print("Sending time:", formatted_time) ws.send("Hello, Server!") result = ws.recv() on_message(ws, result) time.sleep(1) except Exception: print("WebSocket connection closed")Setelah mengubah konfigurasi, tekan tombol
Esc, ketik:wq, lalu tekan Enter untuk menyimpan dan menutup file.
Masuk ke direktori tempat client.py berada dan jalankan perintah berikut untuk mengakses server ECS01.
python3 client.pyRespons berikut menunjukkan bahwa akses berhasil.
WebSocket connection opened Sending time: 2024-04-28 17:00:53 Received message from server: Server received your message: Hello, Server! Sending time: 2024-04-28 17:00:54 Received message from server: Server received your message: Hello, Server!Server ECS01 mengembalikan respons berikut.
WebSocket Server Start on 8080 ... Time: 2024-04-28 17:00:53 WebSocket connection opened Time: 2024-04-28 17:00:53 Received message: Hello, Server! Time: 2024-04-28 17:00:54 Received message: Hello, Server!
Hapus server backend
Anda harus mengatur timeout connection draining sebelum menghapus server backend.
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat grup server dideploy.
Di panel navigasi kiri, pilih .
Temukan grup server target dan klik ID-nya.
Klik tab Backend Servers, temukan server backend target ECS01, lalu klik Remove di kolom Actions.
Pada dialog Remove, klik OK.
Tunggu hingga connection draining selesai
Timeout connection draining diatur menjadi 300 detik dalam topik ini. Hasil pengujian menunjukkan bahwa ALB menghentikan koneksi sekitar 300 detik setelah ECS01 dihapus.
Dalam hasil pengujian, selisih waktu antara saat koneksi WebSocket di server ECS01 dibuka dan saat ditutup adalah 330 detik. Timeout connection draining adalah periode dari saat server backend ECS01 dihapus hingga koneksi WebSocket ditutup, yaitu sekitar 300 detik.
Client mengembalikan respons berikut.
Sending time: 2024-04-28 17:06:23 Received message from server: Server received your message: Hello, Server! Sending time: 2024-04-28 17:06:24 WebSocket connection closedInstans server ECS01 mengembalikan respons berikut.
Time: 2024-04-28 17:06:22 Received message: Hello, Server! Time: 2024-04-28 17:06:23 Received message: Hello, Server! Time: 2024-04-28 17:06:23 WebSocket connection closed
Perilaku gangguan session HTTP
Dalam skenario HTTP, respons yang diterima client bergantung pada timeout connection draining, timeout permintaan koneksi, dan waktu pemrosesan server backend.
Jika timeout connection draining < waktu pemrosesan server backend, koneksi akan terputus sebelum ECS01 selesai mengirim respons. Dalam kasus ini, client menerima respons error tingkat 500.
Jika waktu pemrosesan server backend > timeout permintaan koneksi, permintaan ke ECS01 akan timeout. Dalam kasus ini, client menerima respons error 504.
Topik ini menggunakan timeout connection draining 15 detik dan waktu pemrosesan server backend 30 detik. Dalam skenario ini, koneksi ke ECS01 terputus sebelum respons dikirim, dan client menerima respons error tingkat 500.
Dalam Langkah 2: Atur timeout permintaan koneksi ALB, timeout permintaan koneksi diatur menjadi 60 detik (nilai default), yang lebih besar daripada waktu pemrosesan server backend (30 detik). Oleh karena itu, error 504 tidak dikembalikan. Sebaliknya, error tingkat 500 dikembalikan karena timeout connection draining (15 detik) lebih kecil daripada waktu pemrosesan server backend (30 detik).
Dalam topik ini, fungsi
time.sleepdalam kode Python digunakan untuk mensimulasikan waktu pemrosesan server backend.
Langkah 1: Aktifkan connection draining
Langkah ini menjelaskan cara mengaktifkan connection draining untuk grup server dari prasyarat. Anda juga dapat mengaktifkan fitur ini saat membuat grup server.
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat grup server dideploy.
Di panel navigasi kiri, pilih .
Pada halaman Server Groups, temukan grup server target dan klik ID-nya.
Pada tab Details, temukan bagian Basic Information dan klik Modify Basic Information.
Pada dialog Modify Basic Information, klik Advanced Settings, lalu aktifkan Connection Draining.
Atur Timeout Period menjadi 15 detik dan klik Save.
Langkah 2: Atur timeout permintaan koneksi ALB
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat instans ALB dideploy.
Pada halaman Instances, temukan instans ALB target dan klik ID-nya.
Klik tab Listener, temukan pendengar HTTP target, lalu klik ID pendengar tersebut.
Di area Basic Information, klik Modify Listener.
Pada dialog Modify Listener, klik Modify di samping Advanced Settings.
Atur Connection Request Timeout menjadi 60 detik (nilai default), lalu klik Save.
Langkah 3: Konfigurasi resolusi nama domain
Di panel navigasi kiri, pilih .
Pada halaman Instances, salin nama domain instans ALB.
Lakukan langkah-langkah berikut untuk membuat rekaman CNAME:
CatatanJika nama domain Anda tidak didaftarkan melalui Domain Alibaba Cloud, Anda harus menambahkan nama domain Anda ke DNS Alibaba Cloud sebelum mengonfigurasi rekaman DNS. Untuk informasi lebih lanjut, lihat Kelola nama domain.
Masuk ke Konsol DNS Alibaba Cloud.
Pada halaman Authoritative DNS Resolution, temukan nama domain Anda dan klik Settings di kolom Operations.
Pada tab Settings di halaman detail nama domain, klik Add Record.
Pada panel Add Record, konfigurasikan parameter dan klik OK. Tabel berikut menjelaskan parameter tersebut.
Parameter
Deskripsi
Record Type
Pilih CNAME dari daftar drop-down.
Hostname
Masukkan awalan nama domain. Dalam contoh ini, @ dimasukkan.
CatatanJika Anda menggunakan nama domain root, masukkan
@.Query Source
Pilih Default.
Record Value
Masukkan nilai CNAME, yaitu nama domain instans ALB.
TTL
Pilih nilai waktu hidup (TTL) untuk rekaman CNAME agar di-cache di server DNS. Dalam contoh ini, nilai default digunakan.
Langkah 4: Verifikasi hasil
Masuk dan konfigurasi server
Masuk ke instans ECS01. Untuk informasi lebih lanjut, lihat Pilih metode untuk menghubungkan ke instans ECS.
Jalankan perintah berikut untuk membuat folder HTTP dan masuk ke direktori HTTP.
mkdir http cd httpJalankan perintah berikut untuk mengedit file konfigurasi http_server.py.
vim http_server.pyTekan tombol
iuntuk memasuki mode edit. Lalu, tambahkan konten berikut untuk menjalankan server HTTP.#!/usr/bin/env python3 # encoding=utf-8 from http.server import SimpleHTTPRequestHandler, HTTPServer from datetime import datetime import time class DelayedHTTPRequestHandler(SimpleHTTPRequestHandler): def do_GET(self): current_time = datetime.now() formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S") print("Time:", formatted_time, "GET request received. Responding after a 30 second delay....") time.sleep(30) # Gunakan fungsi time.sleep untuk mensimulasikan waktu pemrosesan server backend. SimpleHTTPRequestHandler.do_GET(self) PORT = 8080 server = HTTPServer(("", PORT), DelayedHTTPRequestHandler) print(f"Serving HTTP on 0.0.0.0 port {PORT} (http://0.0.0.0:{PORT}/) ...") server.serve_forever()Setelah selesai mengedit, tekan tombol
Esc, ketik:wq, lalu tekan Enter untuk menyimpan dan menutup file.
Masuk ke direktori tempat http_server.py berada. Jalankan perintah berikut untuk menjalankan server HTTP.
python3 http_server.pyJika respons berikut dikembalikan, server backend HTTP telah dimulai.
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
Tambahkan server backend ECS01 ke grup server
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat grup server dideploy.
Pada halaman Server Groups, temukan grup server target dan klik Modify Backend Server di kolom Actions.
Pada tab Backend Servers, klik Add Backend Server. Di panel Add Backend Server, pilih ECS01 dan klik Next.
Pada wizard Ports/Weights, pilih instans ECS01, atur port ke
8080, lalu klik OK.
Masuk dan konfigurasi client
Masuk ke client. Buka jendela command-line. Jalankan perintah berikut untuk mengakses server backend ECS01.
curl http://<domain_name>:80/ -vRespons berikut menunjukkan bahwa ALB dapat mengakses layanan backend.
* About to connect() to www.example.com port 80 (#0) * Trying 10.X.X.225... * Connected to www.example.com (10.X.X.225) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.29.0 > Host: www.example.com > Accept: */*Server menerima respons berikut.
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ... Time: 2024-02-07 13:57:33 Received a GET request. Responding after a 30-second delay....
Hapus server backend
Atur timeout koneksi mulus sebelum menghapus server backend.
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat grup server dideploy.
Di panel navigasi kiri, pilih .
Temukan grup server target dan klik ID grup server tersebut.
Klik tab Backend Servers, temukan server backend target ECS01, lalu di kolom Actions, klik Remove.
Pada dialog Remove, klik OK.
Menunggu connection draining
Hasil pengujian menunjukkan bahwa saat timeout koneksi mulus yang diatur untuk ALB < waktu pemrosesan server backend, client menerima respons error 500.
* About to connect() to www.example.com port 80 (#0)
* Trying 10.X.X.224...
* Connected to www.example.com (10.XX.XX.224) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.example.com
> Accept: */*
>
< HTTP/1.1 500 Internal Server Error
< Date: Wed, 07 Feb 2024 06:02:24 GMT
< Content-Type: text/html
< Content-Length: 186
< Connection: close
< Via: HTTP/1.1 SLB.87
<
<html>
<head><title>500 Internal Server Error</title></head>
<body bgcolor="white">
<center><h1>500 Internal Server Error</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Closing connection 0Dokumen terkait
Untuk mengaktifkan connection draining saat membuat grup server, lihat Buat dan kelola grup server.
Untuk melakukan rollout layanan secara mulus, aktifkan fitur slow start. Untuk informasi lebih lanjut, lihat Capai rollout layanan mulus dengan slow start ALB.
Untuk mempelajari protokol WebSocket dan HTTP, lihat Tambahkan pendengar HTTP dan Dorong informasi real-time menggunakan protokol WebSocket dengan ALB.