Archive D.U.A.¶
Contexte¶
Dans le cadre de la fonctionnalité D.U.A./D.U.C., il faut pouvoir exporter un ensemble de documents ainsi que leur métadonnées dans une seule archive afin de pouvoir les transmettre au service des archives départementales.
Le volume de ces documents n'étant pas connu, il faut pouvoir générer à la volée cette archive sans contrainte de taille de stockage.
Solution écartée¶
Fichier ZIP¶
L'implémentation actuelle dans la lib standard de PHP ne permet pas de streamer une archive. Cela nécessiterait de stocker temporairement le fichier complet de l'archive.
Il faudrait alors passer par un processus asynchrone qui implique:
- d'avoir une interface spécifique pour la demande de création de cette archive,
- d'avoir un mécanisme de notification de fin de traitement,
- de récupérer l'archive
- de supprimer l'archive
Ces contraintes impliquent que l'utilisateur dispose de beaucoup plus d'espace de stockage (environ le double).
Résultats du POC¶
Pour essayer de s'approcher au cas d'usage cible de l'archivage des données soumises à la D.U.C., nous avons besoin pour nos test d'un repository d'entités contenant au minimum une propriété indiquant un chemin vers un fichier.
Génération d'une archive TAR¶
Note
Nous avons fait l'expérience suivante: chacun d'entre nous (Léo, Aymeric et Nicolas) avons implémenté une solution distincte, sans trop de concertation, afin d'identifer d'éventuelles approches différentes et intéressantes.
Les trois implémentations de l'équipe sont sensiblement identiques :
- utilisation de l'orm
innmind/formalafin d'itérer sur desSequences lazy d'entité - utilisation de
innmind/filesystemafin de récupérer les fichiers de manière lazy - utilisation de
innmind/encodingafin de produire le fichiertar - on transmet via un endpoint une reponse d'un flux de donnée calculé à la volée (
StreamedResponse) - afin de ne pas rencontrer de time out nous ajoutons un
set_time_limit(0)
Pour une liste de 100 000 entités, on produit une archive de ~80Go transmise en ~45min (soit ~45Mo/sec.) sans rencontrer de time out, ni de fuite mémoire.
Warning
Les performances du POC outrepassant les limitations réseaux, il n'est pas nécessaire de chercher des optimisations supplémentaires à ce niveau.
Compression de l'archive¶
La compression du tar en gzip limite la vitesse de génération du fichier a ~18Mo/sec.
Selon la bande passante disponible de l'utilisateur cette compression pourrait ralentir la transmission du fichier:
- si la bande passante disponible est < aux 18Mo/sec. il est intéressant de compresser le flux
- sinon il ne faut mieux pas compresser
Note
On peut aussi envisager d'utiliser une autre implémentation de gzip plus rapide pour dépasser cette limite de ~18Mo/sec.
Conclusion¶
Aucune limitation ou bloquage n'ont été rencontré avec ces choix techniques.