Planteamiento y alcance
Un producto B2B necesita exportaciones completas e incrementales. Una exportación puede exceder los tiempos de espera (timeouts) de las solicitudes y los límites de archivos individuales, y un cliente puede reintentar después de una descarga interrumpida. La entrevista evalúa los límites de exportación, el estado asíncrono, los puntos de control, la visibilidad de archivos, la autorización y las cuotas de recursos.
Qué está evaluando el entrevistador
El entrevistador quiere ver si puedes convertir un trabajo prolongado en un protocolo observable y reanudable. La Data Portability API de Google trata la exportación como una capacidad dedicada y requiere revisión para alcances confidenciales; las exportaciones incrementales de Zendesk guardan un cursor o límite de tiempo para el siguiente punto de inicio y evitan explícitamente una condición de carrera con escrituras recientes; Oracle FHIR Bulk Export expone una ubicación de trabajo para sondeo. Una respuesta sólida también establece la consistencia de instantáneas, la semántica de eliminación y el aislamiento de inquilinos.
Preguntas para aclarar primero
Confirma los recursos, modo completo versus incremental, filas máximas y retención; si se requiere consistencia entre tablas; si la salida es JSONL, CSV o fragmentos comprimidos; si los clientes necesitan cancelación y descargas por rangos; quién puede crear y descargar; y el presupuesto de concurrencia, ancho de banda y almacenamiento de cada inquilino. No trates "exportación completada" y "archivo descargado" como un mismo estado.
Estructura de respuesta en 30 segundos
Comienza con: "Expondré operaciones de creación, estado, manifiesto/descarga y cancelación. La creación fija el alcance de autorización y el límite de la instantánea y devuelve un ID de trabajo. Los workers leen fragmentos y persisten puntos de control, luego publican un manifiesto de archivos inmutable. El cliente sondea la ubicación del trabajo y recibe credenciales de descarga de corta duración solo después de la finalización. Los puntos de control y las claves de idempotencia hacen que los reintentos de los workers sean seguros; la expiración elimina archivos y libera cuota. Las exportaciones incrementales utilizan un cursor o una marca de límite superior (high-water mark) sellada en lugar de un límite de reloj en movimiento."
Análisis detallado paso a paso
Paso 1: Crear el trabajo y congelar su límite
POST /exports valida la autorización del inquilino, el alcance de los recursos, los filtros y la cuota, y luego crea un exportId imposible de adivinar. El trabajo almacena una instantánea de autorización, formato, compresión, tiempo de creación, expiración y snapshotWatermark. Si la base de datos admite una instantánea consistente, lee la marca de agua en una sola transacción; de lo contrario, especifica que se trata de una instantánea aproximada por recurso, no de una consistencia estricta entre tablas.
Paso 2: Hacer que el estado y la creación sean idempotentes
Acepta un Idempotency-Key; el mismo inquilino y clave devuelven el mismo trabajo. GET /exports/{id} reporta QUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED o EXPIRED, además de los fragmentos procesados y la siguiente acción. La máquina de estados solo avanza. Una actualización condicional decide una carrera entre cancelación y finalización, y los reintentos no deben cobrar la cuota dos veces.
Paso 3: Leer fragmentos y persistir puntos de control
Los workers leen lotes fijos mediante una clave primaria estable o un cursor de instantánea de la base de datos y escriben objetos temporales. Cada fragmento registra (exportId, partition, cursor, rowCount, checksum, objectKey); las confirmaciones (commits) de puntos de control y metadatos de fragmentos son idempotentes. Después de una caída, el worker se vuelve a ejecutar desde el último cursor confirmado. Las versiones deterministas de fragmentos o las escrituras condicionales de objetos sobrescriben duplicados, mientras que el manifiesto final hace referencia a cada fragmento una sola vez.
Paso 4: Definir límites completos e incrementales
La exportación completa lee en o antes de snapshotWatermark; las inserciones y actualizaciones posteriores pertenecen a una ejecución incremental posterior. Una ejecución incremental comienza desde el cursor guardado o la marca de límite superior, no desde "ahora menos un segundo". Zendesk documenta que un cursor puede reutilizarse para la siguiente página y la siguiente exportación, con un retraso de seguridad para evitar carreras con escrituras recientes. Incluye el retraso, el manejo de duplicados y la ventana de reparación en el contrato.
Paso 5: Publicar un manifiesto y descargar de forma segura
Después de que cada fragmento esté completo y verificado, mueve atómicamente el trabajo de RUNNING a SUCCEEDED y crea un manifiesto inmutable que contenga archivos, tamaños, sumas de verificación (checksums) y rangos. El endpoint de descarga devuelve credenciales con alcance limitado al inquilino y a los objetos durante una vida útil corta; no pueden acceder a rutas arbitrarias. Una descarga fallida recupera el mismo manifiesto en lugar de volver a ejecutar la exportación. Los archivos permanecen de solo lectura hasta su expiración.
Paso 6: Proteger recursos, cancelar y limpiar
La creación y la programación aplican límites por inquilino en trabajos concurrentes, filas escaneadas, CPU, almacenamiento de objetos y tráfico de salida (egress). Los trabajos grandes utilizan una cola y un límite de concurrencia global; las solicitudes en línea utilizan un grupo de recursos independiente. La cancelación detiene nuevos fragmentos, marca el trabajo y elimina de forma asíncrona los objetos temporales. Un limpiador reintentable reclama trabajos EXPIRED y registra bytes huérfanos, motivos de fallo y retraso de limpieza. Los eventos de auditoría registran al actor, el alcance y las descargas.
Respuesta modelo de alta calidad
"Crearía un trabajo con POST /exports, validaría la autorización y la cuota del inquilino, y persistiría el alcance, formato, expiración, marca de agua de la instantánea y clave de idempotencia. La respuesta devuelve solo exportId; el cliente sondea GET /exports/{id}. Los workers leen lotes desde un cursor de instantánea, persistiendo el cursor, el recuento de filas y la suma de verificación de cada fragmento. Un reintento se reanuda desde el último punto de control confirmado, y (exportId, partition, cursor) hace que las escrituras duplicadas sean idempotentes. Las exportaciones completas utilizan una marca de agua fija; las exportaciones incrementales guardan un cursor o marca de límite superior más un retraso de seguridad. Una vez verificados todos los fragmentos, se publica un manifiesto inmutable y el trabajo pasa atómicamente a SUCCEEDED; las descargas utilizan credenciales de corta duración vinculadas al inquilino. La cancelación y la expiración detienen el trabajo nuevo, eliminan objetos temporales y liberan cuota. Los límites de tasa, los recursos aislados y los registros de auditoría protegen el tráfico en línea."
Errores comunes y mejoras
- Escanear toda la base de datos en una sola solicitud HTTP: Utiliza un trabajo en cola y un estado consultable para que las conexiones no agoten el tiempo de espera.
- Usar el reloj actual como inicio incremental: Guarda un cursor o una marca de límite superior sellada y define el retraso de seguridad y la política de duplicados.
- Crear un archivo nuevo en cada reintento: Haz que los fragmentos y el manifiesto sean idempotentes; los reintentos solo completan el trabajo faltante.
- Emitir enlaces de descarga permanentes: Vincula las credenciales al inquilino, objeto y expiración; una descarga fallida recupera el mismo archivo.
Preguntas de seguimiento y respuestas
¿Qué sucede si se elimina un registro durante la exportación?
Define primero la semántica del producto. Una exportación de instantánea incluye registros visibles antes de su marca de agua; un flujo incremental debe transportar lápidas (tombstones) o tipos de cambio. Conserva las lápidas hasta que haya pasado la ventana de reparación de cada consumidor.
¿Qué sucede si un worker escribe un archivo y se cae antes de confirmar su punto de control?
Al reiniciar, confía en el punto de control de la base de datos y vuelve a ejecutar el lote. Las escrituras condicionales o las versiones deterministas de fragmentos sobrescriben de forma segura el objeto, y el manifiesto solo acepta fragmentos confirmados y verificados, por lo que el trabajo parcial nunca se puede descargar.
¿Cómo evitas que un inquilino perjudique la base de datos en línea?
Utiliza réplicas de lectura, instantáneas o un grupo de consultas dedicado; limita la concurrencia de escaneo y las filas por segundo. Programa de manera equitativa por inquilino y monitorea el retraso de réplica, las esperas de bloqueo y el tráfico de salida; ralentiza o pausa las exportaciones que superen los umbrales.
¿Cómo puede un cliente reanudar una descarga interrumpida?
Mantén la exportación inmutable y admite descargas por fragmentos o HTTP Range. El cliente almacena el manifiesto, las sumas de verificación y los rangos completados; actualizar las credenciales no cambia la versión del archivo ni vuelve a ejecutar la exportación.