2009-10-26 8 views
9

Ho una domanda sull'hosting di grandi asset generati dinamicamente e Heroku.Heroku: fornitura di grandi asset generati dinamicamente senza un filesystem locale

La mia app offrirà il download in blocco di un sottoinsieme dei dati sottostanti, che consisterà in un file di grandi dimensioni (> 100 MB) generato una volta ogni 24 ore. Se fossi in esecuzione su un server, vorrei solo scrivere il file nella directory pubblica.

Ma come ho capito, questo non è possibile con Heroku. La directory/tmp può essere scritta, ma la durata garantita dei file è seems to be defined in termini di un ciclo richiesta-risposta, non un processo in background.

Mi piacerebbe utilizzare S3 per ospitare il file di download. Lo S3 gem supporta i caricamenti in streaming, ma solo per i file che già esistono sul filesystem locale. Sembra che la dimensione del contenuto debba essere conosciuta in anticipo, cosa che non sarebbe possibile nel mio caso.

Quindi questo sembra un catch-22. Sto cercando di evitare di creare una gigantesca stringa in memoria durante il caricamento su S3, ma S3 supporta solo i caricamenti in streaming per i file che già esistono sul filesystem locale.

Data un'app Rails in cui non riesco a scrivere sul filesystem locale, come posso fornire un file di grandi dimensioni che viene generato quotidianamente senza creare una stringa di grandi dimensioni in memoria?

+0

Sto affrontando lo stesso problema. Non l'ho ancora affrontato, ma stavo dando per scontato che potrei scrivere sul file system/tmp sul mio operatore delayed_job e rimarrà abbastanza a lungo per caricare il file su S3. Interessato a sentire ciò che le persone suggeriscono! –

risposta

10

${RAILS_ROOT}/tmp (non/tmp, è nella directory del vostro app) si protrae per tutta la durata del processo. Se stai eseguendo un DJ in background, i file in TMP dureranno per la durata di quel processo.

In realtà, i file dureranno più a lungo, il motivo per cui diciamo che non è possibile garantire la disponibilità è che tmp non è condiviso tra i server e ogni processo/processo può essere eseguito su un server diverso in base al carico del cloud. Devi anche assicurarti di cancellare i tuoi file quando hai finito con loro come parte del lavoro.

-Un altro dipendente Heroku

+0

@teich, questo ha senso, grazie! –

3

Rich,

Hai provato a scrivere il file ./tmp poi in streaming il file da S3?

-Blake Mizerany (Heroku)

+0

@Blake, non l'ho provato perché la documentazione di Heroku nella directory/tmp (collegata sopra) dice (da quello che posso dire) che il contenuto della directory sopravviverà per la durata di una richiesta. Quello che farei sarebbe nel contesto di un lavoro in background, che sembra come chiedere dei guai. Se sbaglio, allora fantastico - questo risolverebbe il problema. –

Problemi correlati