PDA

Visualizza la versione completa : [Rails]Upload e prestazioni, cache


Albertorrr
08-01-2009, 15:26
Ciao,
sto realizzando delle pagine da cui un utente può inviare(upload) file audio.
Quindi, ho deciso di porre un campo MEDIUMBLOB nella mia tabella mysql e di inserire i file lì.
Ora, ragionando a priori, come posso farmi una idea delle prestazioni che questo servizio avrebbe quando n utenti si trovano a interagire con il form dell'upload inviando file dai 5-10mb?
Consigliate qualcosa per la gestione dei MIME nell'ambito della sicurezza?

Inoltre, poichè nel db ho deciso di salvare anche alcuni avatar, come consigliate di gestire la cache delle immagini per "snellire" le richieste?

Se non erro il server usa Mongrel + Apache, ancora sto lavorando offline.

Grazie per l'attenzione

Alberto

andrea.paiola
08-01-2009, 17:29
l'upload lo farei su file system e nel db metterei solo il nome del file caricato, stessa cosa per le immagini
il mime certo puoi controllarlo

Albertorrr
08-01-2009, 19:22
Ti ringrazio per la risposta.
Preferisco avere consigli sull'ottimizzazione nell'ambito della struttura che ho postato su però.
Infatti, non ritengo che aumentando le informazioni con un campo MediumBlob le ricerche del db diventino più lente, anche perchè ricordo che al posto dei blob viene messo un puntatore ad un'altra allocazione e non all'interno della struttura della tabella, come invece avviene per i campi a lunghezza limitata.
Inoltre, preferisco lavorare su una base sola per evitare eventuali collegamenti corrotti tra filesystem e db(malgrado Rails disponga di before e after save destroy ecc..).
Poi, non ho necessità di manipolare le immagini.

Il MIME posso controllarlo, ma se un cracker prova a mettere del codice maligno all'interno dell'immagine o del file audio siamo sicuri che non viene eseguito?

Pensavo(non so se è possibile), circa l'upload dei file audio, di creare un sottodominio upload.miosito.com e di reindirizzare su quel dominio un'altra porta, affinchè il cms principale rimanga più sgombro.
E' realizzabile una cosa del genere?

Grazie per l'attenzione Andrea.




Alberto

weppos
09-01-2009, 09:01
Per farti una idea sulla validazione MIME così come controlli di sicurezza dai uno sguardo al sorgente di http://github.com/technoweenie/attachment_fu/

Rinnovo il consiglio già espresso: lascia perdere il campo BLOB del DB ed usa il filesystem.

Albertorrr
09-01-2009, 14:28
Ho capito, ma datemi anche una motivazione che si contrapponga a ciò che ho scritto prima perchè possa comprendere l'idea di spostarmi sul filesystem.

Fatto sta che, filesystem o meno, la coda di N upload da 5Mb rimane sulla stessa porta e mi rallenta il resto del cms.

Altre idee?

Grazie anche a te weppos per l'attenzione.

weppos
09-01-2009, 14:32
Originariamente inviato da Albertorrr
Ho capito, ma datemi anche una motivazione che si contrapponga a ciò che ho scritto prima perchè possa comprendere l'idea di spostarmi sul filesystem.

Fatto sta che, filesystem o meno, la coda di N upload da 5Mb rimane sulla stessa porta e mi rallenta il resto del cms.

Altre idee?

Grazie anche a te weppos per l'attenzione.

Operazioni pesanti come batch o upload dovrebbero essere gestite in modo "asicrono" rispetto al sistema principale.
Nel tuo caso puoi portare la procedura di upload su una porta differente e/o su un host differente e far gestire il tutto ad un processo autonomo (nel caso di mongrel è banale) che lavori in modo separato rispetto al sito.

L'upload non necessariamente deve avvenire con Rails. Puoi usare Rails, un altro framework o un altro sistema.
Ad esempio, questo articolo mostra come usare Merb in parallelo su un'altra porta.
http://devblog.rorcraft.com/2008/8/25/uploading-large-files-to-rails-with-merb

Riguardo al perché usare il file system... forse perché è stato creato per gestire file? ;)
Scherzi a parte, le motivazioni sono diverse. Ti consiglio di leggere qualche articolo in merito di approfondimento.

Albertorrr
09-01-2009, 14:50
Riguardo al perché usare il file system... forse perché è stato creato per gestire file? ;)
Riguardo al perchè usare il campo blob... forse perchè è stato creato per contenere valori binari di grandi dimensioni? XD

Quel che ho scritto prima è una sintesi di ciò che avevo letto tempo fa su filesystem e blob a confronto.

Per l'upload creo un'applicazione Rails su un'altra porta allora.(non mi va di impararmi merb solo per questa cosuccia).

Ti ringrazio ancora.

Alberto

weppos
09-01-2009, 14:56
Originariamente inviato da Albertorrr
Riguardo al perchè usare il campo blob... forse perchè è stato creato per contenere valori binari di grandi dimensioni? XD

Quando avrai a che fare con certi database e certi numeri avrai modo di comprendere meglio la differenza. :ciauz:

Albertorrr
09-01-2009, 16:17
Ah non ne ho idea di quel che sara, sto ancora in locale :)
Comunque, se devo fare una piccola ma pesante applicazione su un'altra porta, che dici, meglio lasciare questo incarico a PHP?

Per passare la sessione da Rails a PHP utilizzerei un cookie, poi da PHP genero un altro id di sessione, lo salvo sul db, cambio il cookie, quando l'utente torna su Rails prendo il nuovo valore dal cookie, genero da rails un altro id di sessione e cancello il cookie, che dici?
Devo vedere ancora come utilizzare la cache.

Grazie


Alberto

andrea.paiola
09-01-2009, 16:52
1) ma no che c'entra php
2) la cache non ha senso sulle immagini, la cache di rails usala per il codice da eseguire
3) ti assicuro che avendo le immagini su file system ti semplifichi parecchio la vita, personalmente metterei il timestamp o similare nel nome del file così da avere nomi univoci e caricherei tutto nella stessa cartella... al massimo puoi pensare di avere una cartella per utente ma dipende da quante immagini avrai per utente

per immagini intendo comunque qualsiasi file uploadato... il discorso non cambia

4) volendo controllare se il file è già stato caricato ( evento relativamente frequente ) farei un hash sul contenuto del file e lo metterei nel db come campo unico

Loading