2013-05-25 8 views
35

Interesuje mnie zrozumienie różnych podejść do obsługi przesyłania dużych plików w aplikacji Rails, pliki 2-5 GB.Jakie jest najlepsze podejście do obsługi przesyłania dużych plików w aplikacji szyny?

Rozumiem, że aby przesłać plik o tej wielkości, należy go podzielić na mniejsze części, przeprowadziłem badania i oto, co mam do tej pory.

  • Konflikt po stronie serwera będzie wymagany do akceptowania dużych żądań POST i prawdopodobnie maszyny 64-bitowej do obsługi anything over 4Gb.
  • AWS obsługuje multipart upload.
  • HTML5 FileSystemAPI ma trwały uploader, który przesyła plik w porcjach.
  • Biblioteka dla Bitorrent chociaż wymaga klienta przesyłową, która nie jest idealna

Czy wszystkie z tych metod zostać wznowione jak FTP, powodem, dla którego nie chcesz korzystać z FTP jest to, że chcę zachować w internecie aplikacja, jeśli jest to możliwe? Użyłem carrierwave i spinacza, ale szukam czegoś, co będzie można wznowić, ponieważ przesłanie pliku 5Gb może zająć trochę czasu!

Spośród wymienionych podejść chciałbym podać, co działa dobrze i czy istnieją inne podejścia, których może mi brakować? Brak wtyczek, jeśli to możliwe, wolałby nie używać apletów Java lub Flasha. Inną kwestią jest to, że te rozwiązania przechowują plik w pamięci podczas przesyłania, co jest również ograniczeniem, którego wolałabym uniknąć, jeśli to możliwe.

Odpowiedz

34

Zajmowałem się tym problemem na kilku stronach, używając kilku technik, które zilustrowałem powyżej i kilku, których nie masz. Dobrą wiadomością jest to, że jest całkiem realistyczne, aby umożliwić masowe przesyłanie.

Wiele z tego zależy od tego, co faktycznie planujesz zrobić z plikiem po przesłaniu ... Im więcej pracy musisz wykonać na tym pliku, tym bliżej chcesz go pobrać na serwer. Jeśli chcesz wykonać natychmiastowe przetwarzanie przy przesyłaniu, prawdopodobnie chcesz zrobić rozwiązanie czystych szyn. Jeśli nie musisz wykonywać żadnego przetwarzania lub nie jest to czasochłonne, możesz zacząć rozważać rozwiązania "hybrydowe" ...

Wierz mi lub nie, mam naprawdę dużo szczęścia po prostu używając mod_porter. Mod_porter sprawia, że ​​Apache wykonuje garść prac, które normalnie wykonuje twoja aplikacja. Pomaga to nie wiązać wątku i paczki pamięci podczas przesyłania. Dzięki temu plik jest lokalny dla Twojej aplikacji, co ułatwia przetwarzanie. Jeśli zwrócisz uwagę na sposób przetwarzania przesłanych plików (strumieni myśli), możesz sprawić, że cały proces będzie zużywał bardzo mało pamięci, nawet w przypadku tradycyjnie dość drogich operacji. To podejście wymaga bardzo mało rzeczywistej konfiguracji, aby twoja aplikacja działała i nie ma żadnych rzeczywistych modyfikacji kodu, ale wymaga określonego środowiska (serwera apache), a także możliwości konfiguracji.

Mam również szczęście przy użyciu jQuery-File-Upload, która obsługuje dobre rzeczy, takie jak chunked i wznowić przesłane. Bez czegoś takiego jak mod_porter, to może nadal wiązać cały wątek wykonania podczas wysyłania, ale powinno być przyzwoite dla pamięci, jeśli zrobione dobrze. Powoduje to również, że plik jest "blisko", a w rezultacie łatwy do przetworzenia.To podejście będzie wymagać dostosowania warstwy widoku do wdrożenia i nie będzie działać we wszystkich przeglądarkach.

Wspomniałeś FTP i bittorrent jako możliwe opcje. Nie są tak źle opcji, jak mogłoby się wydawać, ponieważ nadal można uzyskać pliki dość blisko serwera. Nie wykluczają się wzajemnie, co jest miłe, ponieważ (jak zauważyliście) wymagają dodatkowego klienta, który może, ale nie musi być obecny na maszynie ładującej. Działa to w zasadzie tak, że tworzysz obszar do zrzutu, który jest widoczny dla Twojej aplikacji. Następnie, jeśli potrzebujesz wykonać jakiekolwiek przetwarzanie, uruchamiasz zadanie cron (lub cokolwiek innego), aby monitorować tę lokalizację dla przesłanych plików i uruchamiać metodę przetwarzania twoich serwerów. Nie zapewnia to natychmiastowej odpowiedzi, którą powyższe metody mogą zapewnić, ale można ustawić interwał na tyle mały, aby uzyskać dość blisko. Jedyną prawdziwą zaletą tej metody jest to, że stosowane protokoły są lepiej dostosowane do przesyłania dużych plików, dodatkowe wymagania klienta i fragmentacja procesu zwykle przeważają wszelkie korzyści z tego wynikające z mojego doświadczenia.

Jeśli nie potrzebujesz żadnego przetwarzania, najlepszym rozwiązaniem może być po prostu przejście bezpośrednio do S3. To rozwiązanie wypada w drugiej chwili, gdy trzeba zrobić coś z plikami innymi niż serwer jako zasoby statyczne ....

Nie mam żadnego doświadczenia w korzystaniu z interfejsu API FileSystem API w aplikacji rails, więc nie mogę mówić do tego punktu, chociaż wydaje się, że znacznie ograniczyłoby to klientów, których jesteś w stanie poprzeć.

Niestety, nie ma jednej prawdziwej srebrnej kuli - wszystkie te opcje należy porównać z otoczeniem w kontekście tego, co próbujesz osiągnąć. Może na przykład nie być możliwe skonfigurowanie serwera WWW lub trwałe zapisanie w lokalnym systemie plików. Jeśli chodzi o to, co jest warte, myślę, że jQuery-File-Upload jest prawdopodobnie najlepszym rozwiązaniem w większości środowisk, ponieważ wymaga jedynie modyfikacji aplikacji, aby ułatwić przeniesienie implementacji do innego środowiska.

1

Chciałbym obejść serwer szyn i zamieścić duże pliki (podzielone na porcje) bezpośrednio z przeglądarki na Amazon Simple Storage. Spójrz na to post na dzielenie plików za pomocą JavaScript. Jestem trochę ciekawy, jak wydajna jest ta konfiguracja i mam ochotę majstrować przy tej konfiguracji w ten weekend.

+0

@ eabharam..There jest trochę problemu z wydajnością podczas korzystania amazon.have spróbowałem raz – Catmandu

1

Wydaje mi się, że Brad Werth znał odpowiedź na to pytanie: jedno podejście może być przesłane bezpośrednio do S3 (a nawet, jeśli potrzebujesz teoretycznego użycia aws lambda do powiadomienia o swojej aplikacji ... t szczerze mówiąc jestem po prostu zgadywania tutaj, mam zamiar rozwiązać ten sam problem sam, będę rozszerzać o tym później)

http://aws.amazon.com/articles/1434

jeśli używasz carrierwave

1

Ten projekt jest nowy protokół na HTTP obsługuje wznawiania przesyłania dużych plików. Omija Railsy, ​​udostępniając własny serwer.

http://tus.io/

Powiązane problemy