Eventmachine + thin?

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?

Grazie!

Andrea

Andrea D.

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.

Da: [email protected]
A: “ruby-it” [email protected]
Cc:
Data: Tue, 6 Dec 2011 16:34:17 +0100 (CET)
Oggetto: Re: [ruby-it] Eventmachine + thin?

javascript server side ???

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.

Andrea D.

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:

http://www.igvita.com/2008/05/27/ruby-eventmachine-the-speed-demon/

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).

Da: [email protected]
A: “ruby-it” [email protected]
Cc:
Data: Tue, 6 Dec 2011 17:24:01 +0100 (CET)
Oggetto: Re: [ruby-it] Eventmachine + thin?

Proprio quello che stavo cercando :slight_smile: grazie

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?

Andrea D.

Proprio quello che stavo cercando :slight_smile: grazie

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…

Da: [email protected]
A: “ruby-it” [email protected]
Cc:
Data: Tue, 6 Dec 2011 17:38:38 +0100 (CET)
Oggetto: Re: [ruby-it] Eventmachine + thin?

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)?

Grazie ancora!

Andrea D.

On 12/06/2011 04:36 PM, andrea wrote:

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?

Arrivo un po’ in ritardo, prova a dare un’occhiata a
http://kyledrake.net/sinatra-synchrony/

Flavio

Ciao,
se usi ruby 1.9 esistono diverse possibilità di framework asincroni.

Intanto come http server usa rainbows o thin.
Con passenger e unicorn non puoi perchè non supportano operazioni
bloccanti.

Rainbows funziona esattamente come unicorn ma supporta diverse modalità
di esecuzione con thread, fiber ecc…

Tra i vari framework non bloccanti che si basano su eventmachine:

  • supportati sia da thin che da rainbows

  • Cramp

  • async sinatra

  • cool.io

  • gira con un proprio server http

  • goliath

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