Desempeño

El desempeño es un aspecto fundamental en la eficiencia y escalabilidad de los sistemas. Un sistema optimizado no solo responde rápidamente, sino que también administra bien sus recursos y evita degradaciones innecesarias.

Para mejorar el rendimiento, es clave optimizar bases de datos, gestionar eficientemente los recursos, implementar caching y balanceo de carga, y realizar pruebas de estrés con monitoreo continuo.

El desempeño no es un estado fijo, sino un proceso de mejora constante. Adoptar buenas prácticas y ajustes progresivos permite garantizar sistemas más rápidos, confiables y adaptables a nuevas demandas.

Subsections of Desempeño

Bases de datos

Subsections of Bases de datos

¿Cuándo almacenar PDFs en una base de datos relacional?

En la mayoría de los casos, almacenar archivos PDF en una base de datos relacional no es la mejor opción, ya que puede afectar el rendimiento y hacer que la base de datos crezca innecesariamente. Sin embargo, hay escenarios en los que sí puede ser recomendable.

Casos en los que SÍ es recomendable almacenar PDFs en la base de datos

1. Seguridad y control de acceso

Si los archivos contienen información sensible y se requiere un control de acceso estricto.

Ejemplo:

Un sistema de gestión hospitalaria donde los historiales médicos en PDF necesitan ser protegidos con permisos estrictos.

2. Integridad transaccional

Si el PDF es parte de una transacción que debe ser atómica y consistente.

Ejemplo:

Un sistema bancario que almacena comprobantes de transacciones en PDF junto con los datos de la transacción en la base de datos.

3. Alta disponibilidad y respaldo centralizado

Cuando se necesita una estrategia de respaldo y replicación eficiente.

Ejemplo:

Una aplicación empresarial donde los documentos deben ser replicados en múltiples servidores sin depender de almacenamiento externo.

4. Indexación y búsqueda avanzada dentro de los documentos

Si se requiere búsqueda de contenido dentro de los PDFs.

Ejemplo:

Un sistema de gestión documental que usa PostgreSQL con Full-Text Search para buscar palabras clave dentro de los archivos.

Casos en los que NO es recomendable

Si el sistema maneja un alto volumen de archivos y requiere acceso rápido, es mejor almacenar los PDFs en un sistema de archivos o en almacenamiento en la nube (AWS S3, Google Cloud Storage, Azure Blob Storage).

Ejemplo:

Un servicio de almacenamiento en la nube como Google Drive, donde los archivos deben estar disponibles de manera eficiente sin cargar la base de datos.

Alternativa recomendada

En muchos casos, lo mejor es almacenar los PDFs en un sistema de archivos y solo guardar la referencia en la base de datos:

CREATE TABLE documentos (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(255) NOT NULL,
    ruta_archivo TEXT NOT NULL, -- Se almacena la ruta en lugar del archivo
    fecha_subida TIMESTAMP DEFAULT NOW()
);

📌 Conclusión:
Si la seguridad, la transaccionalidad y la indexación son clave, almacenar PDFs en la base de datos puede ser útil. Pero si el acceso rápido y la escalabilidad son prioridad, es mejor usar un sistema de archivos externo.

Lineamientos para el manejo de dependencias en servicios Python

Introducción

Para garantizar la calidad, seguridad y estabilidad de los servicios Python desplegados a través de Jenkins, es fundamental gestionar correctamente las dependencias del proyecto. Este documento establece los lineamientos y mejores prácticas recomendadas para el manejo de dependencias, así como la responsabilidad del equipo de desarrollo en este proceso.


Estándares de dependencias

📌 Uso de requirements.txt Todas las dependencias deben estar declaradas en el archivo requirements.txt. Esto es esencial para la instalación automatizada y la reproducibilidad de los entornos en Jenkins.

📌 Gestión de versiones Es importante fijar la versión exacta de cada dependencia (ejemplo: requests==2.31.0). Definir versiones específicas ayuda a evitar incompatibilidades, errores inesperados y problemas de seguridad.

📌 Selección de dependencias Limita las dependencias a lo estrictamente necesario. No incluyas librerías que no aportan valor directo al proyecto. Esto mejora la seguridad, acelera los despliegues y reduce el tamaño final del artefacto.

📌 Verificación de licencias Antes de agregar un paquete, revisa que su licencia sea compatible con las políticas de la organización.


Buenas prácticas

Revisión de seguridad El flujo CI/CD en la herramienta jenkins cuenta con un escaneo de seguridad, recuerda revisarlo y tomar las medidas necesarias para cumplir con la calidad de entregable.

Aprovechar la biblioteca estándar Evalúa si la funcionalidad que buscas ya existe en la librería estándar de Python antes de añadir un paquete externo.

Entornos virtuales Trabaja siempre con entornos virtuales durante el desarrollo para evitar conflictos y asegurar consistencia en el entorno de ejecución.

Documentación de cambios Cuando actualices o agregues dependencias, registra estos cambios en el repositorio y verifica su funcionamiento mediante pruebas.


Ejemplo de requirements.txt

Flask==2.3.3
requests==2.31.0
gunicorn==21.2.0

Recomendaciones para la gestión de dependencias

  1. Antes de agregar una dependencia

    • Confirma que no esté ya incluida en el proyecto.
    • Consulta la documentación y verifica la licencia.
    • Evalúa vulnerabilidades conocidas para la versión empleada o futura.
  2. Al actualizar dependencias

    • Realiza pruebas para asegurar la compatibilidad.
    • Documenta cambios importantes en el repositorio.

Consideraciones en el despliegue Jenkins

  • Jenkins instalará únicamente las dependencias listadas en requirements.txt.
  • Es responsabilidad del desarrollador asegurar que todas las dependencias necesarias estén declaradas y sean compatibles entre sí.
  • Cualquier problema derivado de dependencias incorrectas, incompatibles o no declaradas podrá afectar el despliegue y operación del servicio.

Estos lineamientos buscan facilitar el trabajo mutuamente benefioso, asi como mantener servicios seguros, eficientes y sostenibles a lo largo del tiempo.

Mejores prácticas HTTP REST

🌐 Guía Breve sobre HTTP REST

REST (Representational State Transfer) es un estilo de arquitectura para diseñar APIs basadas en el protocolo HTTP. Se basa en la interacción entre clientes y servidores mediante operaciones estándar como GET, POST, PUT, PATCH y DELETE.

Las APIs RESTful son utilizadas en la mayoría de aplicaciones web y móviles modernas debido a su simplicidad, escalabilidad y compatibilidad con distintos lenguajes de programación y plataformas.

🎯 ¿Por qué seguir buenas prácticas en REST?

El uso de buenas prácticas en el diseño de APIs REST tiene varias ventajas: ✅ Claridad y coherencia → Facilita la comprensión y el mantenimiento de la API.
Eficiencia → Reduce la carga del servidor y mejora la velocidad de respuesta.
Seguridad → Protege los datos y usuarios contra amenazas como inyecciones SQL o XSS.
Escalabilidad → Permite que la API crezca sin comprometer el rendimiento.
Interoperabilidad → Hace que la API sea más fácil de usar en diferentes plataformas y dispositivos.


🚀 Principales verbos HTTP en REST

  • GET → Obtiene recursos.
    • GET /usuarios/1
  • POST → Crea un nuevo recurso.
    • POST /usuarios
  • PUT → Actualiza un recurso existente (reemplazo completo).
    • PUT /usuarios/1
  • PATCH → Actualiza parcialmente un recurso.
    • PATCH /usuarios/1
  • DELETE → Elimina un recurso.
    • DELETE /usuarios/1

🛠 Mejores prácticas

✅ 1. Usar y responder con JSON

Todas las solicitudes y respuestas deben ser en JSON:

{
  "id": 1,
  "nombre": "Ejemplo"
}

Encabezado recomendado:

Content-Type: application/json
Accept: application/json

✅ 2. Usar sustantivos en lugar de verbos en los endpoints

❌ Incorrecto: /obtenerUsuarios
✔️ Correcto: /usuarios

✅ 3. Nombrar colecciones en plural

✔️ /usuarios, /productos, /pedidos
/usuario, /producto

✅ 4. Anidar recursos para objetos jerárquicos

Si un recurso depende de otro, usa anidamiento:
✔️ GET /usuarios/1/pedidos → Obtiene los pedidos del usuario con ID 1.

✅ 5. Manejar errores adecuadamente

Usar códigos de estado HTTP estándar:

  • 200 OK → Respuesta exitosa
  • 201 Created → Recurso creado
  • 204 No Content → Operación sin respuesta
  • 400 Bad Request → Solicitud mal formada
  • 401 Unauthorized → No autenticado
  • 403 Forbidden → No autorizado
  • 404 Not Found → Recurso no encontrado
  • 500 Internal Server Error → Error del servidor

Ejemplo de respuesta de error:

{
  "error": "Usuario no encontrado",
  "codigo": 404
}

✅ 6. Permitir filtrado, ordenamiento y paginación

Ejemplo de filtrado:
✔️ /usuarios?rol=admin

Ejemplo de ordenamiento:
✔️ /usuarios?sort=nombre

Ejemplo de paginación:
✔️ /usuarios?page=2&limit=10

✅ 7. Mantener buenas prácticas de seguridad

🔒 Usar HTTPS siempre.
🔒 Autenticación con JWT, OAuth2 o API Keys.
🔒 Validar y sanitizar entradas para evitar inyecciones SQL/XSS.

✅ 8. Cachear datos para mejorar el rendimiento

Para reducir la carga del servidor, usar:
✔️ ETag
✔️ Cache-Control: max-age=3600

✅ 9. Versionar la API para cambios futuros

📌 Incluir la versión en la URL:
✔️ /v1/usuarios

📌 O en los headers:
✔️ Accept: application/vnd.miapi.v1+json


🚀 Siguiendo estas prácticas, tu API REST será más clara, escalable y segura.