2.6 KiB
2.6 KiB
Options pour Upload I/O Asynchrone (P2-008)
Date: 2025-01-27
Status: Analyse des options
Contexte
L'upload actuel dans UploadTrack attend la fin de la copie fichier (io.Copy) avant de répondre, bloquant le handler HTTP.
Problème: Pour les gros fichiers, le handler reste bloqué pendant plusieurs minutes.
Option A: 202 Accepted + Job ID (Asynchrone réel)
Sémantique HTTP
- Réponse:
202 Accepted - Body:
{"track_id": "uuid", "status": "uploading", "status_url": "/api/v1/tracks/{id}/status"}
Comportement
- Créer le Track en DB avec
Status=Uploadingimmédiatement - Lancer la copie fichier en goroutine avec suivi (context + cancellation)
- Répondre 202 Accepted immédiatement
- Mettre à jour le Status quand terminé (
CompletedouFailed) - Client peut poller
/api/v1/tracks/{id}/statuspour suivre
Avantages
- ✅ Vraiment asynchrone (handler répond immédiatement)
- ✅ Cohérent avec l'architecture existante (GetUploadStatus existe déjà)
- ✅ Traçabilité complète (logs + request_id via context)
- ✅ Gestion d'erreurs robuste (nettoyage automatique)
- ✅ Support cancellation (context)
Inconvénients
- ⚠️ Nécessite polling côté client
- ⚠️ Plus complexe (goroutine + suivi)
Cohérence avec l'existant
- ✅ Endpoint
GetUploadStatusexiste déjà - ✅ Track a déjà
Status(Uploading, Processing, Completed, Failed) - ✅ Système de jobs existe déjà
Option B: 200 OK mais Streaming Optimisé (Pas vraiment async)
Sémantique HTTP
- Réponse:
200 OK(mais après copie optimisée) - Body:
{"track": {...}}
Comportement
- Lancer la copie en goroutine avec channel
- Attendre la fin avec timeout (comme actuellement)
- Répondre 200 OK après copie
Avantages
- ✅ Plus simple (pas de polling)
- ✅ Réponse immédiate avec résultat final
Inconvénients
- ❌ Pas vraiment asynchrone (handler attend quand même)
- ❌ Bloque toujours le handler (même si optimisé)
- ❌ Pas de suivi de progression
Recommandation: Option A
Raison:
- Cohérent avec l'architecture existante (GetUploadStatus, Track.Status)
- Vraiment asynchrone (handler répond immédiatement)
- Meilleure UX pour gros fichiers (pas de timeout HTTP)
- Traçabilité complète
Implémentation minimale:
- Créer Track avec Status=Uploading avant copie
- Goroutine avec context pour copie + mise à jour Status
- Handler retourne 202 Accepted
- Client poll GetUploadStatus
Décision: ✅ Option A (202 Accepted)