2013-05-22 17 views
12

Dopo che Node.js è uscito, era l'unica cosa che rendeva popolare la programmazione degli eventi. Ma, Ruby ha EventMachine che supporta la scrittura di codice evento.Perché i binari non supportano completamente la scrittura di codice evento fuori dalla scatola

I requisiti per il supporto gestione degli eventi in apparati sono:
1. Server Evented (sottili, arcobaleni) che gestisce un reattore
2. Fibre (rubino 1.9.3) per rendere la scrittura codice evented facile, altrimenti ci potrebbe avere usato discussioni.
3. Tutte le gemme eventualizzate (esempio mysql2).

Nodejs ha mostrato gli evidenti vantaggi della programmazione evento. Quindi, perché la community dei rail NON sta adottando eventmachine? Penso che uno dei motivi per cui le rotaie non sono completamente portabili su eventmachine è dovuto alla dipendenza da gemme sottostanti che potrebbero non essere presenti. Ma qualcuno sa se c'è un piano per fare una mossa in quella direzione?

Rails può fare ciò che fa Nodejs, ma il Nodejs ha iniziato sostenendo la programmazione degli eventi su tutti i produttori di librerie, quindi per convenzione dipendono la maggior parte delle dipendenze che si aggiungono a package.json nel nodo, si sa che sarà eventualizzato e funzionerà con nodejs fuori dalla scatola.

+0

Questo ci porterà tutti all'inferno del callback. – Ven

+0

C'è un modo per evitare che http://rubylearning.com/blog/2010/10/01/an-introduction-to-eventmachine-and-how-to-avoid-callback-spaghetti/ –

+3

Quando Ryan Dhal ha scelto JavaScript (su Ruby, per esempio) per nodejs aveva due cose in testa: (1) C'erano _no_ librerie IO per JavaScript, quindi potevano essere tutte costruite per essere asincrone da zero (2) Il linguaggio veniva usato in modo guidato da un evento iniziare con.Il problema di cui parli - cambiare il modo in cui Rails viene usato è praticamente la ragione più ragionevole per cui JavaScript è stato scelto su ruby ​​per nodejs (il motore JavaScript V8 è _awesome_, ma era una considerazione molto meno importante). Penso che la risposta di Chris riassuma bene. –

risposta

15

Il motivo principale è che l'ecosistema di Rails non è stato creato per l'evento evented e l'introduzione di un singolo pezzo di IO non-evento nell'applicazione elimina i vantaggi. È molto possibile scrivere codice evento in Ruby (e con Rails), ma non sarà necessariamente semplice, in quanto non è sempre chiaro quando le gemme eseguono o non eseguono l'evento Event, e lo sviluppatore dovrebbe impiegare molto tempo inseguire dove potrebbe essere bloccata l'applicazione. In confronto, Node è stato creato con l'ideale implicito che IO non dovrebbe mai essere sincrono e il suo intero ecosistema è derivato da quell'ideale, il che significa che lo sviluppatore non deve preoccuparsi se le loro operazioni di I/O saranno sincronizzate o no; l'assunto di default è che sono asincroni.

Inoltre, le applicazioni Web event sono davvero utili solo quando si è vincolati all'IO. Se la tua applicazione è legata alla CPU, o sta facendo un pesante lavoro sincrono con la CPU, allora un modello evented non è probabilmente l'approccio giusto. Ruby può richiedere una quantità significativa di CPU, principalmente a causa dei costrutti metaprogrammatici della lingua e del garbage collector (che dovrebbe migliorare sostanzialmente in Ruby 2.1!), Il che potrebbe renderlo meno adatto del Node alla programmazione evento.

Rails ha molti modelli di concorrenza disponibili - forking, threading preemptive ed eventing - e spetta allo sviluppatore scegliere quello che meglio si adatta al proprio dominio app. Forking è l'impostazione predefinita perché è semplice, non richiede alcuna considerazione speciale (a patto che si stia distribuendo su un sistema POSIX!) E Ruby non ha avuto thread di sistema quando Rails è stato creato. Ora, con Ruby 1.9+ (thread di sistema, GIL) e JRuby (senza GIL!), Il codice thread è molto facile da implementare. Ruby 2.0 porta un garbage collector amico della COW, il che significa che la biforcazione è più efficiente di prima.

Alla fine della giornata, il codice evento non è l'impostazione predefinita perché richiede più lavoro dallo sviluppatore e, per molte persone, il modello di forking predefinito è sufficiente. Nei casi in cui non lo è, lo sviluppatore ha la possibilità di codice threaded o evented, come meglio si adatta alla loro infrastruttura e dominio dell'applicazione.

+0

+1 per "Il modello di biforcazione predefinito è abbastanza buono". La mia esperienza è che questo è vero per molte, molte app web. –

+1

Avrei +1 per la risposta ben spiegata, ma sono fortemente in disaccordo con "il codice evented non è l'impostazione predefinita perché richiede più lavoro da parte dello sviluppatore". Avendo lavorato sia su sistemi che utilizzano il modello evented come nodejs e il modello di rails, non penso che richieda ulteriore lavoro una volta che ci si abitua. All'inizio c'è una curva di apprendimento ripida, ma una volta passato è semplice come codificare con il modello di biforcazione. –

+0

È più lavoro nell'ecosistema di Rails perché sei autorizzato a controllare personalmente tutto l'IO. In un ecosistema come Node, non hai quel sovraccarico mentale. Le fibre con il modello em-synchrony sono fantastiche se riesci a ottenerle! –