2009-10-26 9 views
9

Mam pytanie dotyczące hostingu dużych zasobów generowanych dynamicznie i Heroku.Heroku: Obsługa dużych, dynamicznie generowanych zasobów bez lokalnego systemu plików

Moja aplikacja oferuje pobieranie zbiorcze podzbioru podstawowych danych, które składają się z dużego pliku (> 100 MB) generowanego co 24 godziny. Gdybym był uruchomiony na serwerze, po prostu zapisałbym ten plik do katalogu publicznego.

Ale jak rozumiem, nie jest to możliwe z Heroku. Katalog/tmp może być zapisany w, ale gwarantowany czas życia plików tam seems to be defined pod względem jednego cyklu żądanie-odpowiedź, a nie zadania w tle.

Chciałbym użyć S3 do przechowywania pliku do pobrania. Interfejs S3 gem obsługuje przesyłanie strumieniowe, ale tylko w przypadku plików, które już istnieją w lokalnym systemie plików. Wygląda na to, że rozmiar treści musi być znany z góry, co nie będzie możliwe w moim przypadku.

To wygląda jak połów-22. Próbuję uniknąć tworzenia gigantycznego ciągu w pamięci podczas przesyłania do S3, ale S3 obsługuje tylko przesyłanie strumieniowe plików, które już istnieją w lokalnym systemie plików.

Biorąc pod uwagę aplikację Rails, w której nie mogę pisać do lokalnego systemu plików, w jaki sposób mogę wyświetlać duży plik, który jest generowany codziennie bez tworzenia dużego ciągu w pamięci?

+0

Mam do czynienia z tym samym problemem. Nie poradziłem sobie z tym jeszcze, ale zakładałem, że mogę napisać do systemu plików/tmp na moim narzędziu delayed_job i będzie to trwało wystarczająco długo, aby przesłać plik do S3. Zainteresowany usłyszeć, co ludzie sugerują! –

Odpowiedz

10

${RAILS_ROOT}/tmp (nie/tmp, to w folderze Twojej aplikacji) trwa przez cały czas trwania procesu. Jeśli używasz DJ-a w tle, pliki w TMP będą trwać przez cały czas trwania tego procesu.

W rzeczywistości pliki będą trwać dłużej, ponieważ nie możemy zagwarantować dostępności, ponieważ tmp nie jest współdzielony między serwerami, a każde zadanie/proces może działać na innym serwerze w oparciu o obciążenie chmury. Musisz również upewnić się, że usuwasz pliki, gdy skończysz z nimi w ramach pracy.

-Inny pracownik Heroku

+0

@teich, to ma sens - dzięki! –

3

Rich,

Czy próbowałeś zapisu pliku do ./tmp następnie strumieniowe plik do S3?

-Blake Mizerany (Heroku)

+0

@Blake, nie próbowałem, ponieważ dokumentacja Heroku w katalogu/tmp (link powyżej) mówi (z tego, co wiem), że zawartość katalogu będzie przetrwać przez czas trwania jednego żądania. To, co bym robił, byłby w kontekście pracy w tle, która wydaje się być pytaniem o kłopoty. Jeśli się mylę, to świetnie - to rozwiąże problem. –