Ciao a tutti,
sto scrivendo un’ applicazione mobile che consuma JSON servito da un’
applicazione rails (mongrel + nginx). Ho notato diversi problemi di
performance e dal profiling sembra che il collo di bottiglia sia rails.
Prima di riscrivere tutto in erlang (o node.js?) volevo provare ad
esplorare delle soluzioni alternative. La combinazione EventMachine +
Thin mi sembrata interessante.
Qualcuno ha esperienza con questa configurazione? Patchare un’
applicazione rails come la mia che espone solo JSON (quindi niente
viste) per girare con eventmachine fattibile in tempi ragionevoli o
meglio se riscrivo tutto?
Ciao a tutti,
sto scrivendo un’ applicazione mobile che consuma JSON servito da un’
applicazione rails (mongrel + nginx). Ho notato diversi problemi di
performance e dal profiling sembra che il collo di bottiglia sia rails.
Prima di riscrivere tutto in erlang (o node.js?)
Addirittura ??? cioe’ arriveresti a sostituire un’applicazione gia’
fatta
con un linguaggio di matrice completamente diversa (funzionale) o con un
javascript server side ???
esplorare delle soluzioni alternative. La combinazione EventMachine + Thin
mi sembrata interessante.
se sei consapevole di cosa significhi programmare in modo non bloccante
allora eventmachine spacca di brutto
Qualcuno ha esperienza con questa configurazione? Patchare un’
applicazione rails come la mia che espone solo JSON (quindi niente viste)
ma questo json e’ generato dai dati presenti in un db ? (il fulcro e’
tutto li’). Hai pensato a una qualche politica di caching (per cui i
JSON
restano in memoria o su disco cosi’ da non passare per ruby/rails tutte
le
volte) ?
nginx puo’ prendere dati da memcached direttamente, se riesci a far
scrivere i json dalla tua app dentro memcached hai vinto.
L’app gi scritta seguendo il paradigma, il salto non sarebbe estremo
considerando poi le dimensioni ridotte della stessa
ma questo json e’ generato dai dati presenti in un db ? (il fulcro e’
tutto li’). Hai pensato a una qualche politica di caching (per cui i JSON
restano in memoria o su disco cosi’ da non passare per ruby/rails tutte le
volte) ?
nginx puo’ prendere dati da memcached direttamente, se riesci a far
scrivere i json dalla tua app dentro memcached hai vinto.
Il caching il mio piano B, aumenterebbe considerevolmente la complessit
dell’ applicazione.
Avresti un tutorial relativamente stringato da consigliarmi su
Eventmachine? Le info sulla wiki cos a occhio non mi sembrano male ma
vorrei qualcosa di pi “copia incolla e lancia” per farmi un’ idea.
Il caching il mio piano B, aumenterebbe considerevolmente la complessit
dell’ applicazione.
Avresti un tutorial relativamente stringato da consigliarmi su
Eventmachine? Le info sulla wiki cos a occhio non mi sembrano male ma
vorrei qualcosa di pi “copia incolla e lancia” per farmi un’ idea.
Questo mi piace un sacco, perche’ sfata un paio di miti sulla
programmazione non bloccante e introduce anche il concetto di reactor:
Occhio che pero’ (non credo fosse chiaro dalla mia mail precedente) non
ci
puoi utilizzare sopra rails, dovrai scriverti “la action” da eseguire ad
ogni richiesta (che poi eventualmente fa il dispatching). Anche le
connessioni al db devono essere non-bloccanti, quindi cerca un adapter
specifico (ce ne sono sicuramene per mysql, postgresql e mongodb).
Domanda forse stupida - per operazioni “bloccanti” si intendono solo
operazioni di I/O? Ovvero, un’ operazione cpu intensive (come, nel mio
caso, un job di ImageMagick) non va messa su un thread separato?
Domanda forse stupida - per operazioni “bloccanti” si intendono solo
operazioni di I/O? Ovvero, un’ operazione cpu intensive (come, nel mio
caso, un job di ImageMagick) non va messa su un thread separato?
Diciamo che nella concezione “moderna” rientrerebbe nei cosiddetti “long
running task” che andrebbero gestiti in asincrono o con un
processo/thread
separato o con un qualche engine tipo backgroundrb/spawn/delayedjob…
running task" che andrebbero gestiti in asincrono o con un processo/thread
separato o con un qualche engine tipo backgroundrb/spawn/delayedjob…
Quindi, se ho capito bene, senza tirarmi dentro delayedjob, aprire alla
grezza un nuovo thread con Thread.new do … end non causa nessun
problema al reactor? E’ tutto thread-safe (ovviamente ammettendo che il
mio codice lo sia)?
Qualcuno ha esperienza con questa configurazione? Patchare un’ applicazione
rails come la mia che espone solo JSON (quindi niente viste) per girare con
eventmachine fattibile in tempi ragionevoli o meglio se riscrivo tutto?
Quando programmi in modo non bloccante tutti gli accessi a fonti esterne
(db, ws, file ecc) devono essere fatti in modo asincrono. Quindi ti
conviene usare tutti i driver di eventmachine di questo tipo.
EM-Sincrony supporta l’accesso a tutta una serie di driver eventmachine
sfruttanto l’uso delle contiuation con i fiber di ruby.
Quindi, se ho capito bene, senza tirarmi dentro delayedjob, aprire alla
grezza un nuovo thread con Thread.new do … end non causa nessun problema
al reactor? E’ tutto thread-safe (ovviamente ammettendo che il mio codice
lo sia)?
In ruby 1.9.x va bene, ma in ruby 1.8 si usano i green thread quindi
potrebbero essere bloccanti.
Probabilmente ti conviene andare sul sicuro e usare Process.fork
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.