Concorrenza

Ciao a tutti,
complimenti per il Ruby Day, un’iniziativa veramente fantastica e ben
riuscita.

Sto sviluppando un applicativo che prevede varie attivit di download,
processing con Imagemagick, e upload di immagini, il tutto
periodicamente
ogni X minuti e all’infinito per ogni utente.
L’iterazione corrente usa Resque pi resque-scheduler per il
re-enqueueing
dei job, con due worker, quindi due CPU pi il lavoro di ImageMagick che
gi multithreaded e onestamente mi pare piuttosto efficiente, ma la
scalabilit mi preoccupa un po’.

Conosco piuttosto bene Celluloid dal punto di vista della concorrenza,
ma
finora l’avevo solamente utilizzato per gestire flussi di eventi di
telefonia o XMPP, che sarebbe poi il suo impiego primario essendo
ispirato
da Erlang.

Siccome il budget veramente molto stringato e ho anche poco tempo
libero,
prima di imbarcarmi in una re-implementazione con Celluloid mi
piacerebbe
avere un’opinione da parte vostra sull’eventuale possibilit di
prestazioni
migliori usando un sistema actor-based, trattandosi di una procedura con
svariati tempi morti bloccanti (download-processing-upload). Il tutto
andrebbe spostato sotto JRuby per sfruttare i thread nativi, oppure
semplicemente lanciato in pi istanze.

Che ne pensate?

Luca

Ciao Luca,

Grazie per i complimenti da parte di tutto lo staff RubyDay!

La soluzione migliore consiste nell’uso del Reactor Pattern:
EventMachine o
Nodejs che sia.
In questo modo ogni worker potrebbe gestire fino molti job in
contemporanea, poich
la maggior parte dei task I/O il download delle immagini e la
comunicazione con ImageMagick.
Infine, siccome sei asincrono, potresti evitarti del tutto la gestione
via
resque, e svolgere tutto
direttamente dai processi principali alla bisogna.

Ciao,

Matteo