Aller au contenu

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/formal afin d'itérer sur des Sequences lazy d'entité
  • utilisation de innmind/filesystem afin de récupérer les fichiers de manière lazy
  • utilisation de innmind/encoding afin de produire le fichier tar
  • 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.