Con 4D 21 R4, obtiene aún más control sobre los recursos de su servidor REST gracias a un nuevo mecanismo de gestión de cuotas.A medida que sus aplicaciones crecen, sus datos pueden ser consumidos por una amplia variedad de clientes: aplicaciones web, aplicaciones móviles, servicios de terceros, integraciones personalizadas y, ahora, incluso herramientas basadas en IA a través de servidores MCP.
Cada cliente interactúa con sus API REST a su manera, generando solicitudes con distintos niveles de complejidad y frecuencia. Para garantizar un rendimiento óptimo en cualquier situación, es importante mantener el control sobre cómo se utilizan los recursos del servidor.
¿Para qué sirven las cuotas?
En el servidor REST 4D, los datos solicitados pueden almacenarse en memoria como conjuntos de entidades para mejorar la eficiencia y la navegación.
En aplicaciones bien diseñadas, estos conjuntos de entidades se liberan cuando ya no son necesarios. Sin embargo, en ecosistemas grandes y diversos, no siempre es posible predecir cómo se comportarán los clientes o si todos los recursos asignados se liberarán correctamente.
Sin cuotas, una gestión ineficaz de los conjuntos de entidades en una sola sesión puede afectar al rendimiento que experimentan otros usuarios.
Por eso, 4D 21 R4 introduce cuotas de sesión para conjuntos de entidades. Con solo unas pocas líneas de código, puede definir límites de recursos que ayudan a mantener bajo control el uso de la memoria, protegen su servidor del consumo excesivo y garantizan una disponibilidad constante para todos los usuarios.
El resultado es un servidor REST más resistente, una administración más sencilla y una mayor confianza a la hora de exponer sus datos a un número cada vez mayor de consumidores.
Configurar cuotas para la sesión REST actual
El comando Session devuelve un objeto que representa la sesión REST. Este objeto incluye quotas propiedad de objeto (una instancia de la clase ` 4D.QuotaManager `).
Ejemplo
A continuación, se muestra el objeto Session.quotas.
{
"nbEntitySets": 100,
"maxEntitySetTimeout": 420,
"defaultEntitySetTimeout": 300,
"currentValues": {}
}
Este expone las siguientes propiedades, que pueden utilizarse para configurar las cuotas de la sesión actual:
– nbEntitySets: el número máximo de conjuntos de entidades permitidos en memoria
–> Un número excesivo de conjuntos de entidades puede consumir demasiada memoria y afectar al rendimiento del servidor REST. Esta propiedad permite limitar el número de conjuntos de entidades que se pueden almacenar simultáneamente en memoria para la sesión actual.
– defaultEntitySetTimeout: el tiempo de espera predeterminado de inactividad permitido para los conjuntos de entidades.
–> Ajustar esta propiedad ayuda a evitar un uso excesivo de memoria, ya que los conjuntos de entidades se liberan automáticamente cuando permanecen sin utilizarse durante más tiempo del especificado.
– maxEntitySetTimeout: el tiempo de espera máximo de inactividad para los conjuntos de entidades
–>Ajustar esta propiedad evita la creación de conjuntos de entidades con tiempos de espera por inactividad excesivamente largos.
Además, la propiedad currentValues también ofrece un atributo nbEntitySets que indica el número de conjuntos de entidades que se mantienen actualmente en memoria para la sesión.
Nota: un valor Undefined significa que no se aplica ninguna cuota y que el servidor REST utiliza su comportamiento predeterminado.
Limitar el número de conjuntos de entidades
Para ello, actualice la propiedad nbEntitySets.
Session.quotas.nbEntitySets:=100
En el ejemplo siguiente, la sesión está limitada a un máximo de 100 conjuntos de entidades en memoria, y ya se han creado 100 conjuntos de entidades:
{
"nbEntitySets": 100,
"currentValues": {
"nbEntitySets": 100
}
}
Al siguiente intento de crear un conjunto de entidades, se devuelve un error mientras sigan habiendo 100 conjuntos de entidades en memoria:
{
"__ERROR": [
{
"message": "Max number of entitysets has been reached for this session.",
"componentSignature": "dbmg",
"errCode": 2017
}
]
}
Un ejemplo más concreto
El modo forceLogin proporciona una primera capa de protección al impedir que se creen conjuntos de entidades en sesiones no autenticadas. Sin embargo, incluso tras la autenticación, es posible que desee restringir aún más el número de conjuntos de entidades que pueden crear determinados roles de usuario.
En el ejemplo siguiente, el modo forceLogin está habilitado.
Un usuario con el rol Guest tiene un límite máximo de 100 conjuntos de entidades.
exposed Function authentify($credentials : Object) : Boolean
var $result:=False
Session.clearPrivileges()
If ($credentials.identifier="Guest")
Session.setPrivileges("")
Session.quotas.nbEntitySets:=100
$result:=True
Else
// Authenticate other users
// ...
Session.quotas.nbEntitySets:=200
$result:=True
End if
return $result
Por supuesto, si no se utiliza el modo forceLogin, también se pueden aplicar cuotas de la misma manera mediante el comando Session.
Configurar el tiempo de espera de inactividad por defecto para los conjuntos de entidades
De forma predeterminada, el tiempo de espera por inactividad de los conjuntos de entidades es de dos horas. Puede modificarlo actualizando la propiedad defaultEntitySetTimeout (en segundos).
Session.quotas.defaultEntitySetTimeout:=300 // 5 minutes
Los conjuntos de entidades creados mediante una solicitud como:
/rest/People?$filter='ID>=1'&$method=entityset
se liberarán automáticamente al cabo de cinco minutos si no se utilizan durante ese periodo (es decir, cuando no se especifique explícitamente ningún tiempo de espera por inactividad en la solicitud).
Configurar el tiempo de espera máximo por inactividad para los conjuntos de entidades
Se puede definir el tiempo de espera máximo por inactividad permitido para los conjuntos de entidades actualizando la propiedad maxEntitySetTimeout (en segundos).
Session.quotas.maxEntitySetTimeout:=420 // 7 minutes
Si se crea un conjunto de entidades con un tiempo de espera por inactividad que supere este límite, se limitará automáticamente a 420 segundos.
Por ejemplo, para la siguiente solicitud:
/rest/People?$filter=ID>=4&$method=entityset&$timeout=600
el conjunto de entidades se liberará tras 420 segundos, ya que se ignora el tiempo de espera solicitado de 600 segundos.
¡Pruebe el HDI adjunto y mejore la robustez de sus aplicaciones de inmediato!
Por el momento, no se pueden publicar comentarios en esta entrada.