Todos los productos
Search
Centro de documentos

Server Load Balancer:Configure connection draining

Última actualización: Sep 21, 2026

Cuando se elimina un servidor de backend o este falla una comprobación de estado, sus conexiones establecidas no se terminan de inmediato. Cerrar estas conexiones abruptamente puede interrumpir las solicitudes en curso e impedir que los servicios se detengan correctamente. Para evitar este problema, utilice la función connection draining de Application Load Balancer (ALB). Si un servidor de backend se elimina o falla una comprobación de estado, connection draining mantiene activas las conexiones existentes durante el periodo configurado. Una vez que expira el tiempo de espera, ALB cierra las conexiones para garantizar una detención controlada.

Escenarios de uso

La función connection draining aplica a los dos escenarios siguientes.

  • Eliminación de un servidor de backend: antes de quitar un servidor de backend, establezca un tiempo de espera de connection draining más largo para permitir que finalicen las solicitudes en curso.

  • Fallo en la comprobación de estado: si un servidor de backend falla esta comprobación, configure un tiempo de espera más corto. Así terminará rápidamente las conexiones defectuosas y evitará que los clientes reciban errores de conexión.

Dado que ambos escenarios comparten la misma configuración de connection draining, debe establecer un tiempo de espera adecuado para sus necesidades de negocio.

Eliminar un servidor de backend

A continuación se muestra un ejemplo. Cuando elimina el servidor de backend ECS01, ALB deja de enviarle nuevas solicitudes. A partir de ese momento, ECS01 solo procesa las solicitudes en curso y no acepta otras nuevas.

  • Si connection draining está deshabilitado, ECS01 cierra la sesión únicamente después de procesar todas las solicitudes en curso.

  • Si connection draining está habilitado y se ha establecido un tiempo de espera:

    • Si el servidor de backend eliminado ECS01 tiene solicitudes en curso, ALB cierra las sesiones existentes en ECS01 cuando expira el tiempo de espera de connection draining.

    • Si el servidor de backend eliminado ECS01 no tiene solicitudes en curso ni conexiones activas, ALB completa el proceso de eliminación de inmediato, sin esperar a que expire el tiempo de espera de connection draining.

    • Si el servidor de backend eliminado ECS01 está procesando una solicitud cuando termina el proceso de eliminación, la conexión se interrumpe y el cliente recibe una respuesta de error 500. Por ejemplo, si el tiempo de espera de connection draining es de 15 segundos pero ECS01 tarda 30 segundos en procesar la solicitud, la conexión se interrumpe antes de que el servidor envíe una respuesta. En este caso, el cliente recibe una respuesta de error 500.

    Nota

    Si vuelve a agregar ECS01 al grupo de servidores, esto no afecta a las sesiones que ya están en proceso de drenaje. ECS01 permanece en estado de drenaje —procesando solo las solicitudes en curso— hasta que se cierren las sesiones existentes. ALB cierra dichas sesiones cuando expira el tiempo de espera de connection draining.

image

La siguiente figura muestra las transiciones de estado de ECS01 después de eliminarlo de un grupo de servidores con connection draining habilitado.

image

Fallo en la comprobación de estado

Cuando el servidor de backend ECS01 falla una comprobación de estado, ALB deja de enviarle nuevas solicitudes. A partir de ese momento, ECS01 solo procesa las solicitudes en curso y no acepta otras nuevas.

  • Si connection draining está deshabilitado, ECS01 permanece en este estado hasta que apruebe la comprobación de estado. Una vez que la aprueba, comienza a aceptar nuevas solicitudes.

  • Si connection draining está habilitado y se ha establecido un tiempo de espera:

    • ALB cierra las sesiones existentes en ECS01 cuando expira el tiempo de espera de connection draining.

    • Si actualiza el grupo de servidores (por ejemplo, al modificar la configuración de ECS01), su estado de conexión no cambia; sigue procesando únicamente las solicitudes en curso. Incluso si ECS01 aprueba una comprobación de estado después de la actualización, ALB cierra sus sesiones existentes cuando expira el tiempo de espera de connection draining.

    Nota
    • Una vez que expira el tiempo de espera de connection draining y ALB cierra las sesiones, ECS01 solo puede aceptar nuevas solicitudes si aprueba la comprobación de estado. Si continúa fallando, no aceptará nuevas solicitudes.

    • Connection draining se activa únicamente por fallos en la comprobación de estado causados por problemas en el servicio de backend, no por fallos derivados de actualizaciones de configuración.

    image

    La siguiente figura muestra las transiciones de estado de ECS01 después de fallar una comprobación de estado.

    image

Configure connection draining según su escenario de negocio. Este tema toma como ejemplo el Escenario 1: eliminar un servidor de backend para mostrar cómo configurar la terminación de sesiones WebSocket y HTTP.

Notas de uso

  • Solo las instancias ALB Standard y con WAF habilitado admiten connection draining. Las instancias ALB Basic no lo admiten.

  • Los grupos de servidores de Function Compute no admiten connection draining.

  • Connection draining funciona tanto para sesiones WebSocket como HTTP. Para las sesiones HTTP, se recomienda establecer el tiempo de espera de connection draining en un valor mayor que el tiempo de espera de solicitud de conexión de ALB. Esto evita que las solicitudes se cierren de forma inesperada. Los valores de tiempo de espera predeterminados ya cumplen esta recomendación. Para obtener información sobre cómo establecer el tiempo de espera de solicitud de conexión, consulte Add an HTTP listener.

Requisitos previos

  • Se creó una instancia ALB Standard o con WAF habilitado, así como un grupo de servidores de tipo Server para dicha instancia. Este tema utiliza una instancia ALB Standard como ejemplo. Para obtener más información, consulte Create an ALB instance y Create and manage a server group.

  • Configuró un listener HTTP en el puerto 80 para la instancia ALB y lo asoció con el grupo de servidores. Para obtener más información, consulte Add an HTTP listener.

  • Creó dos servidores de backend, ECS01 y ECS02. Para obtener más información, consulte Create an instance by using the wizard.

  • Agregó ECS02 al grupo de servidores y este es accesible desde el cliente. Para obtener más información, consulte Use ALB to achieve load balancing for IPv4 services y Use ALB to achieve load balancing for IPv6 services.

    Nota
    • Este tema utiliza un sistema operativo Alibaba Cloud Linux 3.2104 de 64 bits como cliente. Asegúrese de que Python esté instalado tanto en el cliente como en el servidor de backend ECS01. Si no está instalado, consulte las instrucciones en el sitio web oficial de Python. Este tema utiliza Python 3.x como ejemplo.

    • En este tema, ECS02 es el servidor de backend que atiende el tráfico de producción. Si ya cuenta con un servidor de backend de este tipo, no necesita crear uno nuevo.

Procedimiento

Después de habilitar connection draining y establecer un periodo de tiempo de espera, este tema muestra cómo ALB gestiona las solicitudes de sesiones WebSocket y HTTP en distintos estados de connection draining.

Sesiones WebSocket

Paso 1: Habilitar connection draining

Como requisito previo, ya se creó un grupo de servidores. Este paso muestra cómo habilitar connection draining para un grupo de servidores existente. También puede habilitar esta función al crear uno nuevo.

  1. Inicie sesión en la consola de ALB.

  2. En la barra de navegación superior, seleccione la región donde se despliega el grupo de servidores.

  3. En el panel de navegación izquierdo, elija ALB > Server Groups.

  4. En la página Server Groups, busque el grupo de servidores de destino y haga clic en su ID.

  5. En la pestaña Details, dentro de la sección Basic Information, haga clic en Modify Basic Information.

  6. En el cuadro de diálogo Modify Basic Information, haga clic en Advanced Settings y habilite Connection Draining.

  7. Establezca Timeout Period en 300 segundos y haga clic en Save.

Paso 2: Comprobar los resultados

Configurar el servidor

  1. Inicie sesión en la instancia ECS01. Para obtener más información, consulte Connection methods.

  2. Ejecute los siguientes comandos para crear un directorio WebSocket y acceder a él:

    mkdir WebSocket
    cd WebSocket
  3. Ejecute el siguiente comando para instalar las dependencias:

    pip install tornado
    pip install websocket-client
  4. Ejecute el siguiente comando para editar el archivo de configuración server.py:

    vim server.py
    1. Presione i para entrar al modo de edición y agregue la siguiente configuración para iniciar un servicio 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. Después de modificar el archivo de configuración, presione la tecla Esc, introduzca :wq y luego presione Enter para guardar y cerrar el archivo.

  5. Vaya al directorio donde se almacena server.py y ejecute el siguiente comando para iniciar el servicio WebSocket:

    python3 server.py

    La siguiente respuesta indica que el servicio de backend WebSocket se inició.

    Websocket Server Start on 8080 ...

Agregar ECS01 al grupo de servidores

  1. Inicie sesión en la consola de ALB.

  2. En la barra de navegación superior, seleccione la región donde se despliega el grupo de servidores.

  3. En el panel de navegación izquierdo, elija ALB > Server Groups.

  4. En la página Server Groups, busque el grupo de servidores de destino y haga clic en Modify Backend Server en la columna Actions.

  5. En la pestaña Backend Servers, haga clic en Add Backend Server. En el panel Add Backend Server, seleccione ECS01 y haga clic en Next.

  6. En el paso Ports/Weights, seleccione la instancia ECS01, establezca el puerto en 8080 y luego haga clic en OK.

Configurar el cliente

  1. Inicie sesión en el cliente y abra la interfaz de línea de comandos (CLI). Ejecute los siguientes comandos para crear un directorio WebSocket y acceder a él:

    mkdir WebSocket
    cd WebSocket
  2. Ejecute el siguiente comando para instalar las dependencias:

    pip install websocket-client
  3. Ejecute el siguiente comando para editar el archivo client.py:

    vim client.py
    1. Presione i para entrar al modo de edición y agregue la siguiente configuración para iniciar un cliente WebSocket que acceda al servicio:

      #!/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") # Replace <domain_name> with your actual domain name.
          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. Después de modificar el archivo de configuración, presione la tecla Esc, introduzca :wq y luego presione Enter para guardar y cerrar el archivo.

  4. Vaya al directorio donde se almacena client.py y ejecute el siguiente comando para acceder al servidor de backend ECS01:

    python3 client.py

    La siguiente respuesta indica que el acceso fue exitoso.

    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!

    El servidor de backend ECS01 devuelve la siguiente respuesta.

    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!

Eliminar el servidor de backend

Importante

Establezca el tiempo de espera de connection draining antes de eliminar el servidor de backend.

  1. Inicie sesión en la consola de ALB.

  2. En la barra de navegación superior, seleccione la región donde se despliega el grupo de servidores.

  3. En el panel de navegación izquierdo, elija ALB > Server Groups.

  4. Busque el grupo de servidores de destino y haga clic en su ID.

  5. Haga clic en la pestaña Backend Servers, busque el servidor de backend de destino ECS01 y luego haga clic en Remove en la columna Actions.

  6. En el cuadro de diálogo Remove, haga clic en OK.

Esperar el drenaje de conexiones

El parámetro Timeout Period está configurado en 300 segundos. Los resultados de la prueba muestran que ALB termina la sesión aproximadamente 300 segundos después de eliminar ECS01.

Nota

En los resultados de la prueba, la diferencia de tiempo entre la apertura y el cierre de la conexión WebSocket en el servidor ECS01 es de 330 segundos. El periodo de tiempo de espera de connection draining, es decir, la duración desde que se elimina el servidor de backend ECS01 hasta que se cierra la conexión WebSocket, es de aproximadamente 300 segundos.

  • El cliente devuelve la siguiente respuesta.

    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
  • La instancia del servidor ECS01 devuelve la siguiente respuesta.

    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

Sesiones HTTP

En escenarios HTTP, la respuesta que recibe el cliente varía según la configuración del tiempo de espera de connection draining, el tiempo de espera de solicitud de conexión y el tiempo de procesamiento del servidor de backend.

  • Si el tiempo de espera de connection draining es menor que el tiempo de procesamiento del servidor de backend, la conexión se interrumpe antes de que ECS01 envíe una respuesta. En este caso, el cliente recibe una respuesta de error 500.

  • Si el tiempo de procesamiento del servidor de backend es mayor que el tiempo de espera de solicitud de conexión, la solicitud hacia ECS01 agota su tiempo de espera. En este caso, el cliente recibe una respuesta de error 504.

Este tema utiliza como ejemplo un tiempo de espera de connection draining de 15 segundos y un tiempo de procesamiento del servidor de backend de 30 segundos. En este escenario, la conexión se interrumpe antes de que ECS01 termine de enviar la respuesta, por lo que el cliente recibe una respuesta de error 500.

Nota
  • No se devuelve un error 504 porque el tiempo de espera de solicitud de conexión (60 segundos, configurado en Step 2) es mayor que el tiempo de procesamiento del servidor de backend (30 segundos). En cambio, ocurre un error 500 porque el tiempo de espera de connection draining (15 segundos) es menor que el tiempo de procesamiento del servidor.

  • Este tema utiliza la función time.sleep en el código de Python para simular el tiempo de procesamiento del servidor de backend.

Paso 1: Habilitar connection draining

Como requisito previo, ya se creó un grupo de servidores. Este paso muestra cómo habilitar connection draining para un grupo de servidores existente. También puede habilitar esta función al crear uno nuevo.

  1. Inicie sesión en la consola de ALB.

  2. En la barra de navegación superior, seleccione la región donde se despliega el grupo de servidores.

  3. En el panel de navegación izquierdo, elija ALB > Server Groups.

  4. En la página Server Groups, busque el grupo de servidores de destino y haga clic en su ID.

  5. En la pestaña Details, dentro de la sección Basic Information, haga clic en Modify Basic Information.

  6. En el cuadro de diálogo Modify Basic Information, haga clic en Advanced Settings y habilite Connection Draining.

  7. Establezca Timeout Period en 15 segundos y haga clic en Save.

Paso 2: Establecer el tiempo de espera de solicitud de ALB

  1. Inicie sesión en la consola de ALB.

  2. En la barra de navegación superior, seleccione la región donde se despliega la instancia ALB.

  3. En la página Instances, busque la instancia ALB de destino y haga clic en su ID.

  4. Haga clic en la pestaña Listener, busque el listener HTTP de destino y luego haga clic en su ID.

  5. En el área Basic Information, haga clic en Modify Listener.

  6. En el cuadro de diálogo Modify Listener, haga clic en Modify junto a Advanced Settings.

  7. Establezca Connection Request Timeout en 60 seconds (el valor predeterminado) y haga clic en Save.

Paso 3: Configurar la resolución DNS

Para entornos de producción, se recomienda asignar un nombre de dominio personalizado al nombre de dominio de la instancia ALB mediante la creación de un registro CNAME.

  1. En el panel de navegación izquierdo, elija ALB > Instances.

  2. En la página Instances, copie el nombre DNS de la instancia ALB creada.

  3. Siga estos pasos para agregar un registro CNAME.

    Nota

    Si su nombre de dominio está registrado con un proveedor distinto de Alibaba Cloud, debe agregarlo a la consola de Alibaba Cloud DNS antes de configurar la resolución DNS. Para obtener más información, consulte Manage domain names. Si el nombre de dominio está registrado en Alibaba Cloud, continúe con los siguientes pasos.

    1. Inicie sesión en la consola de Alibaba Cloud DNS.

    2. En la página Public Zone, busque el nombre de dominio de destino y haga clic en Settings en la columna Operations.

    3. En la página Settings, haga clic en Add Record.

    4. En el panel Add Record, configure el registro CNAME con los siguientes parámetros y luego haga clic en OK.

      Parámetro

      Descripción

      Record Type

      Seleccione CNAME en la lista desplegable.

      Hostname

      El prefijo de su nombre de dominio. Este tutorial utiliza @.

      Nota

      Para usar un dominio raíz, establezca el nombre de host en @.

      Query Source

      Seleccione Default.

      Record Value

      Introduzca el nombre DNS de la instancia ALB que copió.

      TTL

      El tiempo de vida (TTL) es la duración durante la cual un registro DNS se almacena en caché en un servidor DNS. Utilice el valor predeterminado.

Paso 4: Comprobar los resultados

Configurar el servidor

  1. Inicie sesión en la instancia ECS01. Para obtener más información, consulte Connection methods.

  2. Ejecute los siguientes comandos para crear un directorio HTTP y acceder a él:

    mkdir http
    cd http
  3. Ejecute el siguiente comando para editar el archivo de configuración http_server.py:

    vim http_server.py
    1. Presione i para entrar al modo de edición y agregue la siguiente configuración para iniciar un servicio de servidor 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) # Use the time.sleep function to simulate the processing time of the backend server.
              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. Después de modificar el archivo de configuración, presione la tecla Esc, introduzca :wq y luego presione Enter para guardar y cerrar el archivo.

  4. Vaya al directorio donde se almacena http_server.py y ejecute el siguiente comando para iniciar el servicio de servidor HTTP:

    python3 http_server.py

    La siguiente respuesta indica que el servicio de backend del servidor HTTP se inició.

    Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...

Agregar ECS01 al grupo de servidores

  1. Inicie sesión en la consola de ALB.

  2. En la barra de navegación superior, seleccione la región donde se despliega el grupo de servidores.

  3. En la página Server Groups, busque el grupo de servidores de destino y haga clic en Modify Backend Server en la columna Actions.

  4. En la pestaña Backend Servers, haga clic en Add Backend Server. En el panel Add Backend Server, seleccione ECS01 y haga clic en Next.

  5. En el paso Ports/Weights, seleccione la instancia ECS01, establezca el puerto en 8080 y luego haga clic en OK.

Configurar el cliente

  1. Inicie sesión en el cliente y abra la CLI. Ejecute el siguiente comando para acceder al servidor de backend ECS01:

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

    La siguiente respuesta indica que ALB puede acceder al servicio de 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: */*

    El servidor devuelve la siguiente respuesta.

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

Eliminar el servidor de backend

Importante

Establezca el tiempo de espera de connection draining antes de eliminar el servidor de backend.

  1. Inicie sesión en la consola de ALB.

  2. En la barra de navegación superior, seleccione la región donde se despliega el grupo de servidores.

  3. En el panel de navegación izquierdo, elija ALB > Server Groups.

  4. Busque el grupo de servidores de destino y haga clic en su ID.

  5. Haga clic en la pestaña Backend Servers, busque el servidor de backend de destino ECS01 y luego haga clic en Remove en la columna Actions.

  6. En el cuadro de diálogo Remove, haga clic en OK.

Esperar el drenaje de conexiones

Los resultados de la prueba muestran que el cliente recibe una respuesta de error 500 cuando el tiempo de espera de connection draining configurado en ALB es menor que el tiempo de procesamiento del servidor de backend.

* 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

Documentación relacionada