Saat Anda menghapus server backend atau server tersebut gagal dalam pemeriksaan kesehatan, koneksi yang telah terbentuk tidak langsung dihentikan. Menghentikan koneksi ini secara tiba-tiba dapat mengganggu permintaan yang sedang berlangsung dan mencegah layanan melakukan shutdown yang mulus. Untuk menghindari masalah tersebut, Anda dapat menggunakan fitur connection draining dari Application Load Balancer (ALB). Saat server backend dihapus atau gagal dalam pemeriksaan kesehatan, connection draining menjaga koneksi yang ada tetap aktif selama periode yang telah dikonfigurasi. Setelah timeout berakhir, ALB menutup koneksi untuk memastikan shutdown yang mulus.
Use cases
Connection draining berlaku untuk dua skenario berikut.
Menghapus server backend: Sebelum menghapus server backend, atur timeout connection draining yang lebih lama agar permintaan yang sedang berlangsung dapat selesai.
Kegagalan pemeriksaan kesehatan: Untuk server backend yang gagal dalam pemeriksaan kesehatan, atur timeout yang lebih singkat agar koneksi bermasalah segera dihentikan dan mencegah client menerima error koneksi.
Karena kedua skenario tersebut menggunakan konfigurasi connection draining yang sama, Anda harus menetapkan timeout yang sesuai dengan kebutuhan bisnis Anda.
Remove backend server
Gambar berikut menunjukkan contohnya. Saat Anda menghapus server backend ECS01, ALB berhenti mengirim permintaan baru ke server tersebut. ECS01 kemudian hanya memproses permintaan yang sedang berlangsung dan tidak menerima permintaan baru.
Jika connection draining dinonaktifkan, ECS01 menutup sesi hanya setelah semua permintaan yang sedang berlangsung selesai diproses.
Jika connection draining diaktifkan dan timeout ditetapkan:
Jika server backend ECS01 yang dihapus memiliki permintaan yang sedang berlangsung, ALB menutup sesi yang ada pada ECS01 setelah timeout connection draining berakhir.
Jika server backend ECS01 yang dihapus tidak memiliki permintaan yang sedang berlangsung atau koneksi aktif, ALB langsung menyelesaikan proses penghapusan tanpa menunggu timeout connection draining berakhir.
Jika server backend ECS01 sedang memproses permintaan saat proses penghapusan berakhir, koneksi tersebut dihentikan dan client menerima respons error 500. Misalnya, jika timeout connection draining diatur menjadi 15 detik tetapi waktu pemrosesan permintaan pada ECS01 adalah 30 detik, koneksi akan dihentikan sebelum ECS01 sempat mengirim respons. Dalam kasus ini, client menerima respons error 500.
CatatanJika Anda menambahkan kembali ECS01 ke grup server, hal ini tidak memengaruhi sesi yang sedang dalam proses draining. ECS01 tetap dalam status draining—hanya memproses permintaan yang sedang berlangsung—hingga sesi yang ada ditutup. ALB menutup sesi tersebut ketika timeout connection draining berakhir.
Gambar berikut menunjukkan transisi status ECS01 setelah dihapus dari grup server dengan connection draining diaktifkan.
Health check failure
Saat server backend ECS01 gagal dalam pemeriksaan kesehatan, ALB berhenti mengirim permintaan baru ke server tersebut. ECS01 kemudian hanya memproses permintaan yang sedang berlangsung dan tidak menerima permintaan baru.
Jika connection draining dinonaktifkan, ECS01 tetap dalam status ini hingga lulus pemeriksaan kesehatan. Setelah lulus, server tersebut mulai menerima permintaan baru.
Jika connection draining diaktifkan dan timeout ditetapkan:
ALB menutup sesi yang ada pada ECS01 setelah timeout connection draining berakhir.
Jika Anda memperbarui grup server (misalnya, dengan mengubah konfigurasi ECS01), status koneksi tidak berubah; server tersebut tetap hanya memproses permintaan yang sedang berlangsung. Bahkan jika ECS01 lulus pemeriksaan kesehatan setelah pembaruan, ALB tetap menutup sesi yang ada ketika timeout connection draining berakhir.
CatatanSetelah timeout connection draining berakhir dan ALB menutup sesi, ECS01 hanya dapat menerima permintaan baru jika lulus pemeriksaan kesehatan. Jika terus gagal, server tersebut tidak akan menerima permintaan baru.
Connection draining hanya dipicu oleh kegagalan pemeriksaan kesehatan yang disebabkan oleh masalah layanan backend, bukan oleh kegagalan akibat pembaruan konfigurasi.
Gambar berikut menunjukkan transisi status ECS01 setelah gagal dalam pemeriksaan kesehatan.
Anda dapat mengonfigurasi connection draining berdasarkan skenario bisnis Anda. Topik ini menggunakan Scenario 1: Remove a backend server sebagai contoh untuk menunjukkan cara mengonfigurasi penghentian sesi WebSocket dan HTTP.
Usage notes
Hanya instans ALB jenis Standard dan yang diaktifkan WAF yang mendukung connection draining, sedangkan instans ALB Basic tidak mendukung.
Grup server Function Compute tidak mendukung connection draining.
Connection draining berlaku untuk sesi WebSocket maupun HTTP. Untuk sesi HTTP, kami merekomendasikan mengatur connection draining timeout ke nilai yang lebih besar daripada connection request timeout ALB agar permintaan tidak tertutup secara tak terduga. Nilai timeout default sudah mengikuti rekomendasi ini. Untuk informasi tentang cara mengatur connection request timeout, lihat Add an HTTP listener.
Prerequisites
Instans ALB jenis Standard atau yang diaktifkan WAF telah dibuat, dan grup server tipe Server telah dibuat untuk instans ALB tersebut. Topik ini menggunakan instans ALB Standard sebagai contoh. Untuk informasi lebih lanjut, lihat Create an ALB instance dan Create and manage a server group.
Anda telah mengonfigurasi pendengar HTTP pada port
80untuk instans ALB dan mengaitkannya dengan grup server. Untuk informasi lebih lanjut, lihat Add an HTTP listener.Anda telah membuat dua server backend, ECS01 dan ECS02. Untuk informasi lebih lanjut, lihat Create an instance by using the wizard.
Anda telah menambahkan ECS02 ke grup server, dan server tersebut dapat diakses dari client. Untuk informasi lebih lanjut, lihat Use ALB to achieve load balancing for IPv4 services dan Use ALB to achieve load balancing for IPv6 services.
CatatanTopik ini menggunakan sistem operasi Alibaba Cloud Linux 3.2104 64-bit sebagai client. Pastikan Python telah diinstal baik di client maupun di server backend ECS01. Jika Python belum diinstal, lihat situs resmi Python untuk petunjuk instalasi. Topik ini menggunakan Python 3.x sebagai contoh.
Dalam topik ini, ECS02 adalah server backend yang menangani traffic produksi. Jika Anda sudah memiliki server backend semacam itu, Anda tidak perlu membuatnya lagi.
Procedure
Setelah Anda mengaktifkan connection draining dan menetapkan periode timeout, topik ini menunjukkan bagaimana ALB menangani permintaan untuk sesi WebSocket dan HTTP dalam berbagai status connection draining.
WebSocket sessions
Step 1: Enable connection draining
Grup server telah dibuat sebagai prasyarat. Langkah ini menunjukkan cara mengaktifkan connection draining untuk grup server yang sudah ada. Anda juga dapat mengaktifkan fitur ini saat membuat grup server.
Masuk ke ALB console.
Pada bilah navigasi atas, pilih wilayah tempat grup server dideploy.
Pada panel navigasi kiri, pilih ALB > Server Groups.
Pada halaman Server Groups, temukan grup server target dan klik ID-nya.
Pada tab Details, di bagian Basic Information, klik Modify Basic Information.
Pada dialog Modify Basic Information, klik Advanced Settings dan aktifkan Connection Draining.
Atur Timeout Period menjadi 300 detik dan klik Save.
Step 2: Verify the results
Configure the server
Masuk ke instans ECS01. Untuk informasi lebih lanjut, lihat Connection methods.
Jalankan perintah berikut untuk membuat dan masuk ke direktori WebSocket:
mkdir WebSocket cd WebSocketJalankan perintah berikut untuk menginstal dependensi:
pip install tornado pip install websocket-clientJalankan perintah berikut untuk mengedit file konfigurasi server.py:
vim server.pyTekan
iuntuk masuk ke mode edit dan tambahkan konfigurasi 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 file konfigurasi, tekan tombol
Esc, ketik:wq, lalu tekan Enter untuk menyimpan dan menutup file.
Buka direktori tempat server.py disimpan dan jalankan perintah berikut untuk menjalankan layanan WebSocket:
python3 server.pyRespons berikut menunjukkan bahwa layanan backend WebSocket telah dimulai.
Websocket Server Start on 8080 ...
Add ECS01 to the server group
Masuk ke ALB console.
Pada bilah navigasi atas, pilih wilayah tempat grup server dideploy.
Pada panel navigasi kiri, pilih ALB > Server Groups.
Pada halaman Server Groups, temukan grup server target, lalu klik Modify Backend Server pada kolom Actions.
Pada tab Backend Servers, klik Add Backend Server. Pada panel Add Backend Server, pilih ECS01 dan klik Next.
Pada langkah Ports/Weights, pilih instans ECS01, atur port ke
8080, lalu klik OK.
Configure the client
Masuk ke client dan buka command-line interface (CLI). Jalankan perintah berikut untuk membuat dan masuk ke direktori WebSocket:
mkdir WebSocket cd WebSocketJalankan perintah berikut untuk menginstal dependensi:
pip install websocket-clientJalankan perintah berikut untuk mengedit file client.py:
vim client.pyTekan
iuntuk masuk ke mode edit dan tambahkan konfigurasi berikut untuk menjalankan client WebSocket guna 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 file konfigurasi, tekan tombol
Esc, ketik:wq, lalu tekan Enter untuk menyimpan dan menutup file.
Buka direktori tempat client.py disimpan dan jalankan perintah berikut untuk mengakses server backend 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 backend 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!
Remove the backend server
Atur timeout connection draining sebelum menghapus server backend.
Masuk ke ALB console.
Pada bilah navigasi atas, pilih wilayah tempat grup server dideploy.
Pada panel navigasi kiri, pilih ALB > Server Groups.
Temukan grup server target dan klik ID-nya.
Klik tab Backend Servers, temukan server backend target ECS01, lalu klik Remove pada kolom Actions.
Pada dialog Remove, klik OK.
Wait for connection draining
Timeout Period diatur menjadi 300 detik. Hasil pengujian menunjukkan bahwa ALB menghentikan sesi sekitar 300 detik setelah ECS01 dihapus.
Dalam hasil pengujian, selisih waktu antara pembukaan dan penutupan koneksi WebSocket pada server ECS01 adalah 330 detik. Periode timeout connection draining, yaitu durasi dari saat server backend ECS01 dihapus hingga koneksi WebSocket ditutup, 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
HTTP sessions
Dalam skenario HTTP, respons yang diterima client bervariasi tergantung pada pengaturan connection draining timeout, connection request timeout, dan backend server processing time.
Jika connection draining timeout lebih pendek daripada backend server processing time, koneksi terputus sebelum ECS01 mengirim respons. Dalam kasus ini, client menerima respons error 500.
Jika backend server processing time lebih lama daripada connection request timeout, permintaan ke ECS01 mengalami timeout. Dalam kasus ini, client menerima respons error 504.
Topik ini menggunakan connection draining timeout 15 detik dan backend server processing time 30 detik sebagai contoh. Dalam skenario ini, koneksi terputus sebelum ECS01 selesai mengirim respons, dan client menerima respons error 500.
Error 504 tidak dikembalikan karena connection request timeout (60 detik, diatur dalam Step 2) lebih lama daripada backend server processing time (30 detik). Sebaliknya, error 500 terjadi karena connection draining timeout (15 detik) lebih pendek daripada waktu pemrosesan server.
Topik ini menggunakan fungsi
time.sleepdalam kode Python untuk mensimulasikan backend server processing time.
Step 1: Enable connection draining
Grup server telah dibuat sebagai prasyarat. Langkah ini menunjukkan cara mengaktifkan connection draining untuk grup server yang sudah ada. Anda juga dapat mengaktifkan fitur ini saat membuat grup server.
Masuk ke ALB console.
Pada bilah navigasi atas, pilih wilayah tempat grup server dideploy.
Pada panel navigasi kiri, pilih ALB > Server Groups.
Pada halaman Server Groups, temukan grup server target dan klik ID-nya.
Pada tab Details, di bagian Basic Information, klik Modify Basic Information.
Pada dialog Modify Basic Information, klik Advanced Settings dan aktifkan Connection Draining.
Atur Timeout Period menjadi 15 detik dan klik Save.
Step 2: Set ALB request timeout
Masuk ke ALB console.
Pada 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-nya.
Pada 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) dan klik Save.
Step 3: Configure DNS resolution
Dalam lingkungan produksi, gunakan nama domain Anda sendiri dan arahkan ke nama DNS instans ALB dengan membuat Rekaman CNAME.
-
Pada panel navigasi kiri, pilih .
-
Pada halaman Instances, salin nama DNS instans ALB Anda.
-
Tambahkan Rekaman CNAME untuk memetakan nama domain Anda ke nama DNS instans ALB.
CatatanJika nama domain Anda tidak terdaftar di Alibaba Cloud, Anda harus terlebih dahulu menambahkannya ke Konsol DNS Alibaba Cloud sebelum dapat mengonfigurasi Rekaman DNS. Untuk informasi lebih lanjut, lihat Domain Name Management. Jika nama domain Anda terdaftar di Alibaba Cloud, Anda dapat melanjutkan ke langkah berikutnya.
-
Masuk ke Alibaba Cloud DNS console.
-
Pada halaman Authoritative DNS Resolution, temukan nama domain Anda dan klik Settings pada kolom Operations.
-
Pada halaman Settings, klik Add Record.
-
Pada panel Add Record, konfigurasikan parameter berikut untuk membuat Rekaman CNAME, lalu klik OK.
Konfigurasi
Deskripsi
Record Type
Pilih CNAME dari daftar drop-down.
Hostname
Awalan untuk nama domain Anda. Tutorial ini menggunakan @.
CatatanUntuk menggunakan domain root, atur host ke
@.Query Source
Pilih Default.
Record Value
Tempel nama DNS instans ALB yang telah disalin.
TTL
Time to Live (TTL) adalah durasi penyimpanan cache catatan di Server DNS. Tutorial ini menggunakan nilai default.
-
Step 4: Verify the results
Configure the server
Masuk ke instans ECS01. Untuk informasi lebih lanjut, lihat Connection methods.
Jalankan perintah berikut untuk membuat dan masuk ke direktori HTTP:
mkdir http cd httpJalankan perintah berikut untuk mengedit file konfigurasi http_server.py:
vim http_server.pyTekan
iuntuk masuk ke mode edit dan tambahkan konfigurasi berikut untuk menjalankan layanan 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 mengubah file konfigurasi, tekan tombol
Esc, ketik:wq, lalu tekan Enter untuk menyimpan dan menutup file.
Buka direktori tempat http_server.py disimpan dan jalankan perintah berikut untuk menjalankan layanan server HTTP:
python3 http_server.pyRespons berikut menunjukkan bahwa layanan backend server HTTP telah dimulai.
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
Add ECS01 to the server group
Masuk ke ALB console.
Pada bilah navigasi atas, pilih wilayah tempat grup server dideploy.
Pada halaman Server Groups, temukan grup server target, lalu klik Modify Backend Server pada kolom Actions.
Pada tab Backend Servers, klik Add Backend Server. Pada panel Add Backend Server, pilih ECS01 dan klik Next.
Pada langkah Ports/Weights, pilih instans ECS01, atur port ke
8080, lalu klik OK.
Configure the client
Masuk ke client dan buka CLI. 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 mengembalikan 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....
Remove the backend server
Atur timeout connection draining sebelum menghapus server backend.
Masuk ke ALB console.
Pada bilah navigasi atas, pilih wilayah tempat grup server dideploy.
Pada panel navigasi kiri, pilih ALB > Server Groups.
Temukan grup server target dan klik ID-nya.
Klik tab Backend Servers, temukan server backend target ECS01, lalu klik Remove pada kolom Actions.
Pada dialog Remove, klik OK.
Wait for connection draining
Hasil pengujian menunjukkan bahwa client menerima respons error 500 ketika connection draining timeout yang diatur untuk ALB lebih pendek daripada backend server processing time.
* 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 0Related documentation
Untuk mengaktifkan connection draining saat membuat grup server, lihat Create and manage a server group.
Untuk melakukan rollout layanan secara mulus, Anda dapat mengaktifkan fitur slow start. Untuk informasi lebih lanjut, lihat Configure slow start.
Untuk mempelajari lebih lanjut tentang penggunaan protokol WebSocket dan HTTP dengan ALB, lihat Add an HTTP listener dan Use the WebSocket protocol with ALB to push real-time information.