2009-10-26 8 views
9

J'ai une question sur l'hébergement de grands actifs générés dynamiquement et Heroku.Heroku: Servir de grands actifs générés dynamiquement sans système de fichiers local

Mon application offrira le téléchargement groupé d'un sous-ensemble de ses données sous-jacentes, qui consistera en un gros fichier (> 100 Mo) généré une fois toutes les 24 heures. Si je fonctionnais sur un serveur, j'écrirais simplement le fichier dans le répertoire public. Mais si je comprends bien, ce n'est pas possible avec Heroku. Le répertoire/tmp peut être écrit, mais la durée de vie garantie des fichiers est seems to be defined en termes de cycle de requête-réponse, pas de travail en arrière-plan.

Je voudrais utiliser S3 pour héberger le fichier de téléchargement. Le S3 gem prend en charge les transferts en continu, mais uniquement pour les fichiers qui existent déjà sur le système de fichiers local. Il semble que la taille du contenu doive être connue à l'avance, ce qui ne sera pas possible dans mon cas.

Donc, cela ressemble à un catch-22. J'essaie d'éviter de créer une chaîne gigantesque en mémoire lors du téléchargement vers S3, mais S3 ne prend en charge que les téléchargements en continu pour les fichiers qui existent déjà sur le système de fichiers local.

Étant donné une application Rails dans laquelle je ne peux pas écrire sur le système de fichiers local, comment puis-je servir un fichier volumineux généré quotidiennement sans créer de grande chaîne en mémoire?

+0

Je suis confronté au même problème. Je ne l'ai pas encore abordé mais je supposais que je pourrais écrire dans le système de fichiers/tmp sur mon worker delayed_job et qu'il resterait assez longtemps pour télécharger le fichier sur S3. Intéressé d'entendre ce que les gens suggèrent! –

Répondre

10

${RAILS_ROOT}/tmp (pas/tmp, il est dans le répertoire de votre application) dure pendant toute la durée de votre processus. Si vous exécutez un DJ de fond, les fichiers dans TMP dureront pendant toute la durée de ce processus. En réalité, les fichiers dureront plus longtemps, la raison pour laquelle nous disons que vous ne pouvez pas garantir la disponibilité est que tmp n'est pas partagé entre les serveurs et que chaque travail/processus peut s'exécuter sur un serveur différent basé sur la charge du cloud. Vous devez également vous assurer de supprimer vos fichiers lorsque vous en avez fini avec eux dans le cadre du travail. Un autre employé d'Heroku

+0

@teich, ça a du sens - merci! –

3

Rich,

Avez-vous essayé d'écrire le fichier à ./tmp en continu le fichier à S3?

-Blake Mizerany (Heroku)

+0

@Blake, je n'ai pas essayé parce que la documentation Heroku sur le répertoire/tmp (lié ci-dessus) dit (d'après ce que je peux dire) que le contenu du répertoire survivra pendant la durée d'une requête. Ce que je ferais serait dans le contexte d'un travail de fond, qui semble demander des ennuis. Si je me trompe, alors génial - cela résoudrait le problème. –