15 dic 2025·8 min de lectura

Evitar tiempos de espera en exportaciones: trabajos asíncronos, progreso y streaming

Evita los tiempos de espera en las exportaciones con trabajos asíncronos, indicadores de progreso, paginación y descargas en streaming para informes CSV y PDF de gran tamaño.

Evitar tiempos de espera en exportaciones: trabajos asíncronos, progreso y streaming

Por qué las exportaciones caducan, en términos sencillos

Una exportación caduca cuando el servidor no termina el trabajo antes de un plazo. Ese plazo puede estar fijado por el navegador, un reverse proxy, el servidor de la aplicación o la conexión a la base de datos. Para los usuarios suele parecer aleatorio, porque a veces la exportación funciona y otras falla.

En pantalla normalmente se ve uno de estos escenarios:

  • Un spinner que nunca termina
  • Una descarga que empieza y luego falla con un "error de red"
  • Una página de error después de una larga espera
  • Un archivo que se descarga pero está vacío o corrupto

Las exportaciones grandes son estresantes porque afectan a varias partes del sistema al mismo tiempo. La base de datos tiene que encontrar y ensamblar muchas filas. El servidor de la app tiene que formatearlas en CSV o renderizarlas en PDF. Luego el navegador debe recibir una respuesta grande sin que la conexión se caiga.

Los conjuntos de datos enormes son el disparador obvio, pero las exportaciones “pequeñas” también pueden ser pesadas. Joins costosos, muchos campos calculados, búsquedas por fila y filtros sin índices pueden convertir un informe normal en un timeout. Los PDFs son especialmente riesgosos porque implican maquetación, fuentes, imágenes, saltos de página y con frecuencia consultas adicionales para reunir datos relacionados.

Los reintentos a menudo empeoran las cosas. Cuando un usuario refresca o hace clic en Exportar de nuevo, tu sistema puede iniciar el mismo trabajo dos veces. Ahora la base de datos ejecuta consultas duplicadas, el servidor construye archivos duplicados y tienes un pico justo cuando el sistema ya está luchando.

Si quieres evitar timeouts en exportaciones, trata cada exportación como una tarea en segundo plano, no como una carga de página normal. Incluso en un creador sin código como AppMaster, el patrón importa más que la herramienta: el trabajo largo necesita un flujo diferente al de "clic botón, esperar respuesta".

Elige el patrón de exportación correcto para tu app

La mayoría de fallos de exportación ocurren porque la app usa un solo patrón para todas las situaciones, aunque el tamaño de datos y el tiempo de proceso varíen mucho.

Una exportación síncrona simple (el usuario hace clic, el servidor genera y comienza la descarga) está bien cuando la exportación es pequeña y predecible. Piensa en algunos cientos de filas, columnas básicas, sin formato pesado y no demasiados usuarios ejecutándola a la vez. Si termina consistentemente en un par de segundos, lo simple suele ser lo mejor.

Para cualquier cosa larga o impredecible, usa trabajos de exportación asíncronos. Esto encaja con conjuntos de datos grandes, cálculos complejos, trabajo de maquetación de PDF y servidores compartidos donde una exportación lenta puede bloquear otras peticiones.

Los trabajos asíncronos son más adecuados cuando:

  • Las exportaciones suelen tardar más de 10 a 15 segundos
  • Los usuarios piden rangos de fechas amplios o "todo el tiempo"
  • Generas PDFs con gráficos, imágenes o muchas páginas
  • Varios equipos exportan durante horas pico
  • Necesitas reintentos seguros cuando algo falla

Las descargas en streaming también ayudan cuando la exportación es grande pero se puede producir en orden. El servidor empieza a enviar bytes de inmediato, lo que da sensación de rapidez y evita tener que construir todo el archivo en memoria primero. Es estupendo para CSV largos, pero menos útil si debes calcular todo antes de escribir la primera línea.

Puedes combinar enfoques: ejecuta un trabajo asíncrono para generar la exportación (o preparar una snapshot), y luego haz streaming de la descarga cuando esté lista. En AppMaster, un enfoque práctico es crear un registro "Export Requested", generar el archivo en un proceso de negocio backend y permitir que el usuario descargue el resultado terminado sin mantener abierta la petición del navegador.

Paso a paso: construir un trabajo de exportación asíncrono

El cambio más grande es simple: deja de generar el archivo dentro de la misma petición que el usuario hace al hacer clic.

Un trabajo de exportación asíncrono divide el trabajo en dos partes: una petición rápida que crea el job y trabajo en segundo plano que construye el archivo mientras la app sigue respondiendo.

Un flujo práctico de 5 pasos

  1. Captura la petición de exportación (quién la pidió, filtros, columnas seleccionadas, formato de salida).
  2. Crea un registro de job con estado (queued, running, done, failed), timestamps y un campo de error.
  3. Ejecuta el trabajo pesado en segundo plano usando una cola, un worker programado o un proceso worker dedicado.
  4. Escribe el resultado en almacenamiento (object storage o un file store) y guarda una referencia de descarga en el registro del job.
  5. Notifica al usuario cuando esté listo usando una notificación en la app, email o un canal de mensajes que ya use tu equipo.

Mantén el registro del job como fuente de verdad. Si el usuario refresca, cambia de dispositivo o cierra la pestaña, aún puedes mostrar el mismo estado y el mismo botón de descarga.

Ejemplo: un manager de soporte exporta todos los tickets del último trimestre. En lugar de esperar con una pestaña girando, ve una entrada de job que pasa de queued a done y entonces aparece la descarga. En AppMaster puedes modelar la tabla de jobs en el Data Designer, construir la lógica en el Business Process Editor y usar un campo de estado para controlar la interfaz.

Indicadores de progreso en los que los usuarios confían

Un buen indicador de progreso reduce la ansiedad y evita que la gente haga clic en Exportar cinco veces. También ayuda a prevenir timeouts indirectamente, porque los usuarios están más dispuestos a esperar cuando la app muestra avance real.

Muestra progreso en términos que la gente entienda. El porcentaje por sí solo suele ser engañoso, así que acompáñalo con algo concreto:

  • Paso actual (Preparando datos, Obteniendo filas, Construyendo archivo, Subiendo, Listo)
  • Filas procesadas sobre el total (o páginas procesadas)
  • Hora de inicio y última actualización
  • Tiempo estimado restante (solo si se mantiene razonablemente estable)

Evita la precisión falsa. Si aún no conoces el trabajo total, no muestres 73%. Usa hitos primero y luego pasa al porcentaje cuando conozcas el denominador. Un patrón simple es 0% a 10% para la preparación, 10% a 90% basado en filas procesadas y 90% a 100% para la finalización del archivo. Para PDFs con tamaños de página variables, sigue verdades más pequeñas como "registros renderizados" o "secciones completadas".

Actualiza lo suficiente como para que parezca vivo, pero no tanto como para sobrecargar tu base de datos o cola. Un enfoque común es escribir el progreso cada 1 a 3 segundos o cada N registros (por ejemplo, cada 500 o 1,000 filas), lo que sea menos frecuente. También registra un timestamp ligero de latido (heartbeat) para que la UI pueda decir "Todavía trabajando" incluso cuando el porcentaje no se mueva.

Da control al usuario cuando algo tarde más de lo esperado. Permite cancelar una exportación en ejecución, iniciar una nueva sin perder la primera y ver el historial de exportaciones con estados (Queued, Running, Failed, Ready) y un mensaje corto de error.

En AppMaster, un registro típico se ve como ExportJob (status, processed_count, total_count, step, updated_at). La UI consulta ese registro y muestra un progreso honesto mientras el job asíncrono genera el archivo en segundo plano.

Paginación y filtrado para mantener el trabajo acotado

Crea progreso en el que los usuarios confíen
Muestra el progreso paso a paso como fetching rows, building file y uploading.
Construir ahora

La mayoría de timeouts de exportación ocurren porque la exportación intenta hacerlo todo de una vez: demasiadas filas, demasiadas columnas, demasiados joins. La solución más rápida es mantener el trabajo acotado para que los usuarios exporten una porción más pequeña y clara de datos.

Empieza desde el objetivo del usuario. Si alguien necesita "las facturas del mes pasado que fallaron", no por defecto muestres "todas las facturas de siempre". Haz que los filtros sean normales, no una tarea extra. Un rango de fechas sencillo más un filtro de estado suele reducir el conjunto de datos en un 90%.

Un buen formulario de petición de exportación normalmente incluye un rango de fechas (con valores por defecto sensatos como últimos 7 o 30 días), uno o dos estados clave, búsqueda opcional o selección de cliente/equipo, y una vista previa de conteo cuando sea posible (incluso una estimación).

En el servidor, lee datos en trozos usando paginación. Esto mantiene la memoria estable y te da puntos de control naturales para el progreso. Siempre usa un orden estable al paginar (por ejemplo, ordenar por created_at y luego por id). Sin eso, filas nuevas pueden deslizarse a páginas anteriores y perderás o duplicarás registros.

Los datos cambian durante exportaciones largas, así que decide qué significa "consistente". Un enfoque sencillo es registrar un tiempo de snapshot cuando el job comienza y exportar solo filas hasta ese timestamp. Si necesitas consistencia estricta, usa una lectura consistente o una transacción cuando tu base de datos lo permita.

En una herramienta sin código como AppMaster, esto se mapea limpiamente a un proceso de negocio: valida filtros, establece snapshot time y luego itera por páginas hasta que no haya más que recuperar.

Streaming de descargas sin sobrecargar el servidor

Añade pantallas de historial de exportaciones
Crea interfaces que reflejen el estado del job y se actualicen automáticamente.
Probar AppMaster

Streaming significa empezar a enviar el archivo al usuario mientras todavía lo estás generando. El servidor no tiene que construir todo el CSV o PDF en memoria primero. Es una de las maneras más fiables de evitar timeouts cuando los archivos son grandes.

El streaming no hace milagros con consultas lentas. Si el trabajo de la base de datos tarda cinco minutos antes de tener el primer byte listo, la petición puede seguir caducando. La solución habitual es combinar streaming con paginación: obtienes un bloque, lo escribes y sigues.

Para mantener la memoria baja, escribe conforme avanzas. Genera un bloque (por ejemplo, 1,000 filas CSV o una página PDF), escríbelo en la respuesta y haz flush para que el cliente siga recibiendo datos. Evita acumular filas en un gran arreglo "solo para ordenar después". Si necesitas un orden estable, ordena en la base de datos.

Cabeceras, nombres y tipos de contenido

Usa cabeceras claras para que navegadores y apps móviles traten la descarga correctamente. Establece el content type correcto (por ejemplo, text/csv o application/pdf) y un nombre de archivo seguro. Los nombres deben evitar caracteres especiales, ser cortos e incluir un timestamp si los usuarios exportan el mismo informe varias veces.

Reanudar y descargas parciales

Decide desde el principio si soportas reanudar. El streaming básico a menudo no soporta reanudar por rango de bytes, especialmente para PDFs generados. Si lo vas a soportar, debes manejar peticiones Range y generar una salida consistente para el mismo job.

Antes de lanzar, asegúrate de:

  • Enviar las cabeceras antes de escribir el cuerpo, luego escribir en bloques y hacer flush
  • Mantener tamaños de chunk constantes para que la memoria permanezca plana bajo carga
  • Usar un orden determinista para que los usuarios confíen en la salida
  • Documentar si se soporta reanudar y qué pasa si la conexión se cae
  • Añadir límites del lado servidor (máx. filas, tiempo máximo) y devolver un error amigable cuando se alcance

Si construyes exportaciones en AppMaster, mantén la lógica de generación en un flujo backend y haz streaming desde el servidor, no desde el navegador.

CSV grandes: tácticas prácticas

Para CSV enormes, deja de tratar el archivo como un blob único. Contrúyelo como un bucle: lee una porción de datos, escribe filas, repite. Eso mantiene la memoria plana y hace los reintentos más seguros.

Escribe el CSV fila a fila. Incluso si generas la exportación en un job asíncrono, evita "recoger todas las filas y luego stringify". Mantén un writer abierto y añade cada fila tan pronto como esté lista. Si tu stack lo permite, usa un cursor de base de datos o recorre resultados por páginas para no cargar millones de registros a la vez.

La corrección del CSV importa tanto como la velocidad. Un archivo puede parecer correcto hasta que alguien lo abre en Excel y la mitad de columnas se desalinean.

Reglas CSV que evitan archivos rotos

  • Escapa siempre comas, comillas y saltos de línea (envuelve el campo entre comillas y duplica cualquier comilla interior)
  • Emite en UTF-8 y prueba nombres no ingleses de extremo a extremo
  • Usa una fila de cabecera estable y conserva el orden de columnas fijo entre ejecuciones
  • Normaliza fechas y decimales (elige un formato y mantenlo)
  • Evita fórmulas si un dato puede empezar con =, +, - o @

El rendimiento suele morir en el acceso a datos, no al escribir. Vigila los N+1 lookups (como cargar cada cliente dentro de un bucle). Obtén datos relacionados en una sola consulta o precarga lo necesario y luego escribe filas.

Cuando las exportaciones son realmente enormes, divide a propósito. Un enfoque práctico es un archivo por mes, por cliente o por tipo de entidad. Un "export de 5 años de pedidos" puede convertirse en 60 archivos mensuales, cada uno generado independientemente, de modo que un mes lento no bloquee todo.

Si usas AppMaster, modela el dataset en el Data Designer y ejecuta la exportación como un proceso de negocio en segundo plano, escribiendo filas mientras recorres páginas de registros.

PDFs grandes: mantenerlos previsibles

Publica flujos de descarga fiables
Genera las exportaciones en el servidor y entrega las descargas cuando el archivo esté listo.
Probar AppMaster

La generación de PDFs suele ser más lenta que la de CSV porque consume CPU. No solo mueves datos: maquetas páginas, colocas fuentes, dibujas tablas y a menudo redimensionas imágenes. Trata los PDFs como tareas en segundo plano con límites claros, no como una respuesta rápida.

Las decisiones de plantilla determinan si una exportación de 2 minutos se convierte en una de 20 minutos. Los diseños simples ganan: menos columnas, menos tablas anidadas y saltos de página previsibles. Las imágenes son una de las maneras más rápidas de ralentizar todo, especialmente si son grandes, alta resolución o se obtienen de almacenamiento remoto durante el render.

Decisiones de plantilla que suelen mejorar velocidad y fiabilidad:

  • Usa una o dos fuentes y evita cadenas de fallback pesadas
  • Mantén encabezados y pies de página simples (evita gráficos dinámicos en cada página)
  • Prefiere iconos vectoriales sobre imágenes raster grandes
  • Limita los layouts "auto fit" que miden el texto muchas veces
  • Evita transparencias complejas y sombras

Para exportaciones grandes, renderiza por lotes. Genera una sección o un pequeño rango de páginas a la vez, escríbelo en un archivo temporal y luego ensambla el PDF final. Esto mantiene la memoria estable y hace los reintentos más seguros si un worker cae a mitad de camino. También combina bien con trabajos asíncronos y progreso que avanza en pasos significativos (por ejemplo: "Preparando datos", "Renderizando páginas 1-50", "Finalizando archivo").

También cuestiona si el PDF es realmente lo que el usuario necesita. Si principalmente quieren filas y columnas para análisis, ofrece CSV junto a "Exportar PDF". Puedes generar aun así un PDF resumen más pequeño para informes y mantener el dataset completo en CSV.

En AppMaster esto encaja de forma natural: ejecuta la generación de PDF como un job en segundo plano, informa del progreso y entrega el archivo terminado como descarga cuando el job se complete.

Errores comunes que causan timeouts

Los fallos en exportaciones normalmente no son misteriosos. Unas pocas decisiones funcionan bien con 200 filas y luego se rompen con 200,000.

Los errores más comunes:

  • Ejecutar toda la exportación dentro de una petición web. El navegador espera, el worker del servidor se queda ocupado y cualquier consulta lenta o archivo grande te empuja más allá de los límites de tiempo.
  • Mostrar progreso basado en tiempo en vez de en trabajo. Un temporizador que corre hasta 90% y luego se queda estancado hace que los usuarios refresquen, cancelen o inicien otra exportación.
  • Leer todas las filas en memoria antes de escribir el archivo. Fácil de implementar y una manera rápida de alcanzar límites de memoria.
  • Mantener transacciones largas o ignorar bloqueos. Las consultas de exportación pueden bloquear escrituras, o verse bloqueadas por ellas, y la lentitud se propaga por la app.
  • Permitir exportaciones ilimitadas sin limpieza. Clics repetidos amontonan jobs, llenan almacenamiento y dejan archivos viejos por ahí para siempre.

Un ejemplo concreto: un responsable de soporte exporta todos los tickets de los últimos dos años y hace doble clic porque parece que no pasa nada. Ahora dos exportaciones idénticas compiten por la misma base de datos, ambas construyen enormes archivos en memoria y ambas caducan.

Si lo construyes en una herramienta sin código como AppMaster, se aplican las mismas reglas: saca las exportaciones del camino de la petición, rastrea progreso por filas procesadas, escribe la salida conforme avanzas y pon límites simples sobre cuántas exportaciones puede ejecutar un usuario a la vez.

Comprobaciones rápidas antes de lanzar

Itera sin reescribir la lógica
Mantén las exportaciones manejables regenerando el código fuente cuando cambien los requisitos.
Probar AppMaster

Antes de lanzar una función de exportación a producción, haz una pasada rápida con mentalidad de temporizador. El trabajo largo ocurre fuera de la petición, los usuarios ven progreso honesto y el servidor nunca intenta hacerlo todo a la vez.

Una checklist previa al despliegue:

  • Las exportaciones grandes se ejecutan como jobs en background (las pequeñas pueden ser síncronas si terminan rápido de forma fiable)
  • Los usuarios ven estados claros como queued, running, done o failed con timestamps
  • Los datos se leen en chunks con un orden estable (por ejemplo, created time más un desempate por ID)
  • Los archivos terminados pueden descargarse más tarde sin volver a ejecutar la exportación, incluso si el usuario cierra la pestaña
  • Hay un plan de límites y limpieza para archivos y el historial de jobs (borrado por edad, máximo de jobs por usuario, límites de almacenamiento)

Una buena prueba de cordura es intentar tu peor caso: exportar el rango de fechas más grande que permites mientras alguien más está añadiendo registros. Si ves duplicados, filas faltantes o progreso atascado, tu ordenamiento o chunking no es estable.

Si construyes en AppMaster, estas comprobaciones se traducen en piezas reales: un proceso en segundo plano en el Business Process Editor, un registro de export job en la base de datos y un campo de estado que la UI consulta y refresca.

Haz que las fallas resulten seguras. Un job fallido debe conservar su mensaje de error, permitir reintentar y evitar crear archivos parciales que parezcan "terminados" pero estén incompletos.

Ejemplo: exportar años de datos sin congelar la app

Exporta datos grandes por lotes
Recorre los registros en páginas para mantener la memoria estable en exportaciones grandes.
Empezar

Un responsable de operaciones necesita dos exportaciones cada mes: un CSV con los últimos 2 años de pedidos para análisis y un conjunto de PDFs mensuales de facturas para contabilidad. Si tu app intenta construir cualquiera de los dos en una petición web normal, acabarás alcanzando límites de tiempo.

Empieza por acotar el trabajo. La pantalla de exportación pide un rango de fechas (por defecto: últimos 30 días), filtros opcionales (estado, región, comercial) y una elección clara de columnas. Ese cambio suele convertir un problema de 2 años y 2 millones de filas en algo manejable.

Cuando el usuario hace clic en Exportar, la app crea un registro Export Job (type, filters, requested_by, status, progress, error_text) y lo pone en una cola. En AppMaster, esto es un modelo en Data Designer más un Business Process que corre en segundo plano.

Mientras el job se ejecuta, la UI muestra un estado en el que el usuario puede confiar: queued, processing (por ejemplo, 3 de 20 chunks), generating file, ready (botón de descarga) o failed (error claro y opción de reintentar).

El chunking es el detalle clave. El job CSV lee pedidos en páginas (digamos 50,000 a la vez), escribe cada página en la salida y actualiza el progreso tras cada chunk. El job de PDF hace lo mismo por lotes de facturas (por ejemplo, un mes a la vez), así un mes lento no bloquea todo.

Si algo falla (filtro erróneo, permiso faltante, error de almacenamiento), el job se marca como Failed con un mensaje corto que el usuario pueda entender: "No se pudieron generar las facturas de marzo. Vuelve a intentar o contacta con soporte con el Job ID 8F21." Un reintento reutiliza los mismos filtros para que el usuario no tenga que empezar de nuevo.

Próximos pasos: convierte las exportaciones en una función integrada, no en una emergencia

La manera más rápida de prevenir timeouts a largo plazo es dejar de tratar las exportaciones como un botón puntual y convertirlas en una característica estándar con un patrón repetible.

Elige un enfoque por defecto y úsalo en todas partes: un job asíncrono genera un archivo en segundo plano y luego el usuario obtiene la opción de descargar cuando esté listo. Esa decisión elimina la mayoría de las sorpresas de "funcionó en pruebas", porque la petición del usuario no tiene que esperar al archivo completo.

Facilita que la gente encuentre lo que ya generó. Una página de historial de exportaciones (por usuario, por workspace o por cuenta) reduce exportaciones repetidas, ayuda a soporte a responder "¿dónde está mi archivo?" y te da un lugar natural para mostrar estado, errores y expiración.

Si construyes este patrón dentro de AppMaster, ayuda que la plataforma genere código fuente real y soporte lógica backend, modelado de base de datos e interfaces web/móviles en un solo lugar. Para equipos que quieren lanzar trabajos asíncronos de exportación de forma rápida y fiable, appmaster.io se usa a menudo para crear la tabla de jobs, el proceso en segundo plano y la UI de progreso sin cablear todo manualmente.

Luego mide lo que realmente duele. Rastrea consultas lentas, tiempo empleado en generar CSV y tiempo de renderizado de PDF. No necesitas observabilidad perfecta para empezar: registrar duración y conteo de filas por exportación muestra rápido qué informe o combinación de filtros es el problema real.

Trata las exportaciones como cualquier otra característica de producto: coherente, medible y fácil de soportar.

FAQ

¿Por qué las exportaciones caducan incluso cuando a veces funcionan?

Una exportación caduca cuando el trabajo no termina antes de un límite establecido en algún punto del flujo de la petición. Ese límite puede venir del navegador, de un reverse proxy, del servidor de la aplicación o de la conexión a la base de datos, por lo que puede parecer aleatorio aun cuando la causa raíz sea carga consistente o consultas lentas.

¿Cuándo está bien una exportación “clic y descargar” normal y cuándo debo usar trabajos asíncronos?

Usa una exportación síncrona simple solo cuando termine de forma fiable en un par de segundos y con un tamaño de datos predecible. Si las exportaciones suelen tardar más de 10–15 segundos, abarcan rangos grandes, implican cálculos pesados o PDFs, cambia a un trabajo asíncrono para que la petición del navegador no tenga que permanecer abierta.

¿Cuál es el flujo asíncrono más simple que puedo implementar en AppMaster?

Crea primero un registro de trabajo y luego realiza el trabajo pesado en segundo plano; al final permite que el usuario descargue el archivo terminado. En AppMaster, un esquema común es un modelo ExportJob en el Data Designer más un Business Process en backend que actualiza status, campos de progreso y una referencia al archivo almacenado mientras se ejecuta.

¿Cómo muestro un progreso que los usuarios realmente confíen?

Mide trabajo real, no tiempo transcurrido. Una solución práctica es almacenar campos como step, processed_count, total_count (cuando se conozca) y updated_at, y que la UI consulte esos campos para mostrar estados claros y evitar que los usuarios piquen el botón de exportar por impaciencia.

¿Cómo evito que los usuarios inicien la misma exportación varias veces?

Haz la petición de exportación idempotente y usa el registro del job como la fuente de la verdad. Si el usuario vuelve a clicar, muestra el trabajo en ejecución existente (o bloquea duplicados para los mismos filtros) en lugar de iniciar el mismo trabajo costoso dos veces.

¿Cuál es la forma más segura de paginar datos en exportaciones grandes?

Lee y escribe por partes para que la memoria se mantenga estable y tengas puntos de control naturales. Usa paginación estable con un orden determinista (por ejemplo, ordenar por created_at y luego por id) para no perder ni duplicar filas mientras los datos cambian durante una exportación larga.

¿Cómo mantengo las exportaciones consistentes si los datos cambian mientras el trabajo se ejecuta?

Registra un tiempo de snapshot cuando el job empieza y exporta solo filas hasta ese timestamp para que la salida no "se mueva" mientras se ejecuta. Si necesitas garantías más estrictas, usa lecturas consistentes o estrategias de transacción que soporte tu base de datos, pero comienza con una regla de snapshot clara que la mayoría de usuarios entienda.

¿El streaming por sí solo evita los timeouts?

El streaming ayuda cuando puedes producir la salida en orden y empezar a enviar bytes pronto, sobre todo para CSV grandes. No arregla consultas lentas que tardan minutos antes del primer byte y puede seguir habiendo timeout si no se escribe nada por demasiado tiempo, por lo que el streaming funciona mejor combinado con paginación que escriba bloques constantemente.

¿Cuáles son las causas más comunes de exportaciones CSV rotas o lentas?

Escribe las filas sobre la marcha y sigue reglas estrictas de escapado para que el archivo no falle al abrirlo en Excel u otras herramientas. Mantén la codificación consistente (normalmente UTF-8), fija las cabeceras y el orden de columnas, y evita lookups por fila que conviertan una exportación en miles de consultas extra.

¿Por qué las exportaciones PDF fallan más a menudo que las CSV y cómo las hago más fiables?

La generación de PDFs requiere más CPU por layout, fuentes, imágenes y saltos de página, por eso trátala como un trabajo en segundo plano con límites claros. Simplifica las plantillas, evita imágenes grandes o remotas en el renderizado y comunica el progreso en pasos significativos para que los usuarios sepan que está funcionando.

Fácil de empezar
Crea algo sorprendente

Experimente con AppMaster con plan gratuito.
Cuando esté listo, puede elegir la suscripción adecuada.

Empieza