All Products
Search
Document Center

Server Load Balancer:Gunakan connection draining ALB untuk shutdown layanan yang mulus

Last Updated:Mar 26, 2026

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.

    Catatan

    Jika 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.

image

Gambar berikut menunjukkan transisi status ECS01 setelah dihapus dari grup server tempat connection draining diaktifkan.

image

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.

    Catatan
    • Saat 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.

    image

    Gambar berikut menunjukkan transisi status ECS01 setelah gagal dalam pemeriksaan kesehatan.

    image

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 80 dan 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.

    Catatan
    • Topik 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.

  1. Masuk ke Konsol ALB.

  2. Di bilah navigasi atas, pilih wilayah tempat grup server dideploy.

  3. Di panel navigasi kiri, pilih ALB > Server Groups.

  4. Pada halaman Server Groups, temukan grup server target dan klik ID-nya.

  5. Pada tab Details, temukan bagian Basic Information dan klik Modify Basic Information.

  6. Pada dialog Modify Basic Information, klik Advanced Settings, lalu aktifkan Connection Draining.

  7. Atur Timeout Period menjadi 300 detik dan klik Save.

Langkah 2: Verifikasi hasil

Konfigurasi server

  1. Masuk ke instans ECS01. Untuk informasi lebih lanjut, lihat Metode koneksi.

  2. Jalankan perintah berikut untuk membuat direktori bernama WebSocket dan masuk ke direktori tersebut.

    mkdir WebSocket
    cd WebSocket
  3. Jalankan perintah berikut untuk menginstal dependensi yang diperlukan.

    pip install tornado
    pip install websocket-client
  4. Jalankan perintah berikut untuk mengedit file konfigurasi server.py.

    vim server.py
    1. Tekan tombol i untuk 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()
      
    2. Setelah mengubah konfigurasi, tekan tombol Esc, ketik:wq, lalu tekan Enter untuk menyimpan dan menutup file.

  5. Masuk ke direktori tempat server.py berada dan jalankan perintah berikut untuk menjalankan server WebSocket.

    python3 server.py

    Respons berikut menunjukkan bahwa layanan backend WebSocket telah dimulai.

    Websocket Server Start on 8080 ...

Tambahkan server backend ECS01 ke grup server

  1. Masuk ke Konsol ALB.

  2. Di bilah navigasi atas, pilih wilayah tempat grup server dideploy.

  3. Di panel navigasi kiri, pilih ALB > Server Groups.

  4. Pada halaman Server Groups, temukan grup server target dan klik Modify Backend Server di kolom Actions.

  5. Pada tab Backend Servers, klik Add Backend Server. Di panel Add Backend Server, pilih ECS01 dan klik Next.

  6. Pada langkah Ports/Weights, pilih instans ECS01, atur port ke 8080, lalu klik OK.

Konfigurasi client

  1. Masuk ke client dan buka antarmuka baris perintah. Jalankan perintah berikut untuk membuat direktori bernama WebSocket dan masuk ke direktori tersebut.

    mkdir WebSocket
    cd WebSocket
  2. Jalankan perintah berikut untuk menginstal dependensi yang diperlukan.

    pip install websocket-client
  3. Jalankan perintah berikut untuk mengedit file client.py.

    vim client.py
    1. Tekan tombol i untuk 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")
      
    2. Setelah mengubah konfigurasi, tekan tombol Esc, ketik:wq, lalu tekan Enter untuk menyimpan dan menutup file.

  4. Masuk ke direktori tempat client.py berada dan jalankan perintah berikut untuk mengakses server ECS01.

    python3 client.py

    Respons 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

Penting

Anda harus mengatur timeout connection draining sebelum menghapus server backend.

  1. Masuk ke Konsol ALB.

  2. Di bilah navigasi atas, pilih wilayah tempat grup server dideploy.

  3. Di panel navigasi kiri, pilih ALB > Server Groups.

  4. Temukan grup server target dan klik ID-nya.

  5. Klik tab Backend Servers, temukan server backend target ECS01, lalu klik Remove di kolom Actions.

  6. 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.

Catatan

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 closed
  • Instans 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.

Catatan
  • 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.sleep dalam 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.

  1. Masuk ke Konsol ALB.

  2. Di bilah navigasi atas, pilih wilayah tempat grup server dideploy.

  3. Di panel navigasi kiri, pilih ALB > Server Groups.

  4. Pada halaman Server Groups, temukan grup server target dan klik ID-nya.

  5. Pada tab Details, temukan bagian Basic Information dan klik Modify Basic Information.

  6. Pada dialog Modify Basic Information, klik Advanced Settings, lalu aktifkan Connection Draining.

  7. Atur Timeout Period menjadi 15 detik dan klik Save.

Langkah 2: Atur timeout permintaan koneksi ALB

  1. Masuk ke Konsol ALB.

  2. Di bilah navigasi atas, pilih wilayah tempat instans ALB dideploy.

  3. Pada halaman Instances, temukan instans ALB target dan klik ID-nya.

  4. Klik tab Listener, temukan pendengar HTTP target, lalu klik ID pendengar tersebut.

  5. Di area Basic Information, klik Modify Listener.

  6. Pada dialog Modify Listener, klik Modify di samping Advanced Settings.

  7. Atur Connection Request Timeout menjadi 60 detik (nilai default), lalu klik Save.

Langkah 3: Konfigurasi resolusi nama domain

  1. Di panel navigasi kiri, pilih ALB > Instances.

  2. Pada halaman Instances, salin nama domain instans ALB.

  3. Lakukan langkah-langkah berikut untuk membuat rekaman CNAME:

    Catatan

    Jika 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.

    1. Masuk ke Konsol DNS Alibaba Cloud.

    2. Pada halaman Authoritative DNS Resolution, temukan nama domain Anda dan klik Settings di kolom Operations.

    3. Pada tab Settings di halaman detail nama domain, klik Add Record.

    4. 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.

      Catatan

      Jika 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

  1. Masuk ke instans ECS01. Untuk informasi lebih lanjut, lihat Pilih metode untuk menghubungkan ke instans ECS.

  2. Jalankan perintah berikut untuk membuat folder HTTP dan masuk ke direktori HTTP.

    mkdir http
    cd http
  3. Jalankan perintah berikut untuk mengedit file konfigurasi http_server.py.

    vim http_server.py
    1. Tekan tombol i untuk 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()
      
    2. Setelah selesai mengedit, tekan tombol Esc, ketik :wq, lalu tekan Enter untuk menyimpan dan menutup file.

  4. Masuk ke direktori tempat http_server.py berada. Jalankan perintah berikut untuk menjalankan server HTTP.

    python3 http_server.py

    Jika 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

  1. Masuk ke Konsol ALB.

  2. Di bilah navigasi atas, pilih wilayah tempat grup server dideploy.

  3. Pada halaman Server Groups, temukan grup server target dan klik Modify Backend Server di kolom Actions.

  4. Pada tab Backend Servers, klik Add Backend Server. Di panel Add Backend Server, pilih ECS01 dan klik Next.

  5. Pada wizard Ports/Weights, pilih instans ECS01, atur port ke 8080, lalu klik OK.

Masuk dan konfigurasi client

  1. Masuk ke client. Buka jendela command-line. Jalankan perintah berikut untuk mengakses server backend ECS01.

    curl http://<domain_name>:80/ -v

    Respons 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

Penting

Atur timeout koneksi mulus sebelum menghapus server backend.

  1. Masuk ke Konsol ALB.

  2. Di bilah navigasi atas, pilih wilayah tempat grup server dideploy.

  3. Di panel navigasi kiri, pilih ALB > Server Groups.

  4. Temukan grup server target dan klik ID grup server tersebut.

  5. Klik tab Backend Servers, temukan server backend target ECS01, lalu di kolom Actions, klik Remove.

  6. 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 0

Dokumen terkait