2009-05-30 9 views
14

Antecedentes: Estoy escribiendo una aplicación web 'estándar' (nada especial) en Ruby (no en Rails) y necesito empezar a pensar en la implementación.¿Utiliza JRuby para aplicaciones web de Ruby? ¿Vale la pena?

He escuchado muchas recomendaciones para utilizar JRuby para implementar aplicaciones web Ruby, independientemente de si realmente necesita o no bibliotecas Java. ¿Qué tan cierto es esto? ¿Vale la pena usar la implementación de Java solo por velocidad? ¿Ganaría algo más al hacerlo? ¿Me encontraría con algún problema?

PD: No conozco Java tan bien, así que "puedes escribir partes de él en Java" no es muy útil.

Respuesta

21

JRuby es una de las implementaciones de ruby ​​más completas (hay muchas otras como IronRuby, Maglev, Rubinius, XRuby, YARV, MacRuby). Es muy completo, por lo tanto, a menos que use gemas que usen código C nativo, muy probablemente sea simplemente compatible con la compatibilidad.

JRuby es un poco más rápido que la implementación real de C, pero admite subprocesos reales, mientras que la implementación oficial tiene problemas para conseguirlo (todavía usa Green Threads). Usar hilos Java de JRuby es bastante trivial, aunque requerirá que acople su código con Java (con un pequeño DI, este acoplamiento solo ocurrirá una vez).

Otro beneficio: herramientas de tiempo de ejecución. Java, como una plataforma , en lugar de un idioma, tiene un lote de herramientas de tiempo de ejecución para ayudarlo a diagnosticar problemas y verificar el estado de la aplicación (perfiles, JConsole, etc.).

Twitter ingenieros también mencionaron que el Rubí VM poco tiene problemas para ser un entorno para procesos de larga vida, mientras que el JVM es muy bueno en eso, porque se ha optimizado para que durante los últimos diez años.

Ruby también tuvo un pequeño problema de seguridad recientemente, lo que no afectó la implementación de JRuby.

Por otro lado, su proyecto requiere más artefactos (JVM, JRuby jarras, etc.). Si está utilizando una aplicación que se mantendrá con vida durante mucho tiempo, y desea un mejor soporte en tiempo de ejecución, JRuby puede ser una gran manera de hacerlo. De lo contrario, puedes esperar sin peligro hasta que necesites estas cosas para realizar el cambio (es probable que vaya sin problemas).

+1

excelente respuesta, eso es exactamente lo que necesitaba saber. Gracias. :) –

+3

La versión de los desarrolladores de Twitter sobre Ruby es algo engañosa. Si el problema había sido lo que estaban diciendo, lo sensato habría sido ir con JRuby. No movieron su código de Ruby a Java, lo reescribieron en Scala. Parece que su problema fue más con su código que con MRI. – Chuck

+4

Tenga en cuenta también que el movimiento de Twitter Ruby-Scala fue principalmente en la parte de la aplicación que a) admitieron que estaba mal hecho en Ruby y (b) está bien adaptado a un lenguaje de alto rendimiento de todos modos. –

6

Uso y amo JRuby a diario, pero le sugiero que use MRI (a.k.a. C-Ruby) a menos que tenga una necesidad real de JRuby.

Razones para usar JRuby:

integración
  1. Java
  2. entorno restringido (su máquina tiene instalado Java no rubí y usted no tiene raíz)
  3. entorno restringido (que haya instalado el rubí, pero no tienen raíz modo no se puede instalar gemas que necesita)
  4. usted alcanzado los límites de Ruby 1.8 rendimiento y no se puede utilizar 1,9

Según lo que describió, no tiene ninguno de los motivos anteriores.

C-Ruby 1.9 tiene mejoras de rendimiento significativas sobre C-Ruby 1.8. Todavía tengo que leer (o descubrir por mí mismo) cómo se compara C-Ruby 1.9 con JRuby 1.8 o JRuby 1.9. En cualquier caso, no tiene un problema de rendimiento (todavía), así que no se preocupe.

La buena noticia es que puede comenzar con cualquiera de ellos y convertirlos más tarde si es necesario. Es todo Ruby, y las gemas Webrick y Mongrel funcionan con ambos.

Como se mencionó anteriormente, las gemas de rubí que tienen extensiones C no se pueden instalar bajo JRuby. Esperemos que esto cambie en el futuro si las extensiones de ruby ​​C utilizan FFI.

http://kenai.com/projects/ruby-ffi/pages/Home

http://isitjruby.com/

+0

Bueno, no estoy usando ninguna extensión C que no tenga equivalentes Java, así que eso no es un problema. Tengo dos incentivos para usar JRuby en este momento: 1) hilos reales contra los hilos "falsos" que utilizan MRI y YARV (aunque supongo que no es un gran problema), y 2) acceso a bibliotecas Java (que, como Dije anteriormente, significa que puedo usar una base de datos específica de Java, o algo así). ¿Puede MRI/YARV coincidir con eso? –

+0

Si está pensando en utilizar varios subprocesos, creo que los hilos reales de JRuby son un gran problema. Con un diseño alternativo, para C-Ruby, puede utilizar BackgroundRb http://backgroundrb.rubyforge.org/ u otras técnicas de "descarga" como reliable-msg http://github.com/assaf/reliable-msg/tree/master – Rob

+0

Hmm, BackgroundRb parece interesante, ¡eche un vistazo! ¡Gracias! –