es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El servidor FastAPI que se ejecuta en AWS App Runner falla después de 24 horas.

Tengo un servidor FastAPI configurado con Gunicorn, desplegado en AWS App Runner. Cuando intento acceder al endpoint, funciona perfectamente; sin embargo, después de 24 horas, cuando intento acceder al mismo endpoint, obtengo un error de puerta de enlace 502 y no se registra nada en CloudWatch a partir de ese momento, hasta que vuelvo a implementar la aplicación y luego vuelve a funcionar correctamente.

Sospecho que esto tiene que ver con la configuración de Gunicorn en sí, que de alguna manera está cerrando mi API después de un cierto tiempo, y no AWS App Runner, pero no he encontrado ninguna solución. También he incluido a continuación mi configuración de Gunicorn. Cualquier ayuda será apreciada.

from fastapi import FastAPI
import uvicorn
from fastapi.middleware.cors import CORSMiddleware
from gunicorn.app.base import BaseApplication
import os
import multiprocessing
api = FastAPI()
def number_of_workers():
    print((multiprocessing.cpu_count() * 2) + 1)
    return (multiprocessing.cpu_count() * 2) + 1
class StandaloneApplication(BaseApplication):
    def __init__(self, app, options=None):
        self.options = options or {}
        self.application = app
        super().__init__()

    def load_config(self):
        config = {
            key: value for key, value in self.options.items()
            if key in self.cfg.settings and value is not None
        }
        for key, value in config.items():
            self.cfg.set(key.lower(), value)

    def load(self):
        return self.application
@api.get("/test")
async def root():
    return 'Success'
if __name__ == "__main__":
    if os.environ.get('APP_ENV') == "development":
        uvicorn.run("api:api", host="0.0.0.0", port=2304, reload=True)
else:
    options = {
        "bind": "0.0.0.0:2304",
        "workers": number_of_workers(),
        "accesslog": "-",
        "errorlog": "-",
        "worker_class": "uvicorn.workers.UvicornWorker",
        "timeout": "0"
    }

    StandaloneApplication(api, options).run()

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema podría estar relacionado con el tiempo de espera del trabajador de Gunicorn. Por defecto, Gunicorn finalizará cualquier trabajador que haya estado activo durante 30 segundos o más. En algunos casos, este tiempo de espera puede ocurrir antes de que el balanceador de carga de App Runner envíe tráfico a un trabajador saludable, lo que puede resultar en un error 502 de puerta de enlace incorrecta.

    Para solucionar esto, puedes intentar aumentar el tiempo de espera del trabajador de Gunicorn agregando la siguiente línea a tus opciones:

    options = {
        ...
        "timeout": 120, # o cualquier número de segundos que desees establecer
    }
    

    Esto aumentará el tiempo de espera del trabajador a 120 segundos, lo cual debería ser suficiente tiempo para atender las solicitudes sin provocar un tiempo de espera. Puedes ajustar el valor según sea necesario.

    Alternativamente, puedes intentar aumentar el número de trabajadores para distribuir la carga de manera más equitativa y reducir la probabilidad de tiempos de espera. Puedes hacer esto ajustando la función number_of_workers() para que devuelva un número mayor de trabajadores.

    def number_of_workers():
        return (multiprocessing.cpu_count() * 2) + 2 # o cualquier número mayor de trabajadores
    

    Ten en cuenta que aumentar el número de trabajadores también aumentará los recursos necesarios para atender las solicitudes, por lo que es posible que necesites equilibrar el número de trabajadores con los recursos disponibles.

    Si ninguna de estas soluciones funciona, es posible que desees revisar los registros de tu aplicación para ver si hay algún error que pueda estar causando el cierre del trabajador. También puedes intentar usar un servidor diferente como uvicorn sin Gunicorn para ver si el problema persiste.

Comments are closed.