2010-10-27 25 views
10

Tengo una startup que considera construir un backend de Java y un frontend de Rails. El backend de Java se encargará de crear una capa de almacenamiento en caché para la base de datos y ofrecer otros servicios adicionales. El frontend de Rails será principalmente para crear las herramientas de monitoreo y aplicaciones web.Java Backend and Rails Frontend

¿Qué startups/compañías usan este tipo de configuración? ¿Cuáles son algunos inconvenientes en términos de velocidad de desarrollo, implementación, escalabilidad e integración?

(Qué sería de gran ayuda para mí es la experiencia personal o estudios de casos informales. Me gustaría prioridades de-respuestas que abordan alternativas como Grails o JRuby a menos que resulta ser una gran parte de la ecuación)

¡Gracias!

+0

¿Qué esperas que esté en el back-end, y cómo debe comunicarse el frontend con el back-end? –

+0

@Thorbjorn: En cuanto a la comunicación, me estoy inclinando hacia JSON. Aunque no estoy convencido de qué biblioteca usar o las compensaciones que la acompañan, como el mantenimiento. ¿Pensamientos? – Ian

+0

TWitter está haciendo esto. Su frontend es Rails y su backend está usando Scala. Creo que estás haciendo lo correcto: usar la herramienta adecuada para el trabajo correcto. –

Respuesta

2

Tal vez estoy diciendo lo obvio aquí, pero lo más importante aquí es el hecho real de que estás combinando dos tecnologías. No solo el desarrollo será más lento: Rails y todos los frameworks Java esperan tener una aplicación Ruby/Java completa, pero para los otros problemas que mencionas (implementación, escalabilidad, integración), las herramientas y soluciones existentes no funcionarán, o al menos no muy bien.

Si tiene un motivo convincente para combinar los dos, siga adelante, pero espere pasar más tiempo con estos problemas que con una única solución tecnológica. Si no lo hace, elija Rails o Java.

+1

Puede ser obvio, pero ayuda que le dé un énfasis extra, gracias. Mi pensamiento es que cada idioma es probablemente mejor para hacer ciertas tareas que el otro. Por ejemplo, al menos personalmente, Rails es mucho más rápido en la creación de prototipos de una aplicación web. ¿Cómo puedo cuantificar/calificar la compensación de esa manera entre el tiempo ganado allí y el tiempo perdido con el despliegue, la escalabilidad y la integración. – Ian

+0

@Jeroen: No estoy de acuerdo con lo que usted indicó. Es una decisión arquitectónica. No puedo decir sobre Rails, pero los frameworks Java NO esperan una aplicación Java completa. Esto es completamente lo contrario que vemos hoy en día. No hay una solución mágica y debemos elegir la tecnología que mejor se adapte a cada problema. Si está construyendo una gran aplicación SOA, esta clara separación de preocupaciones es quizás el camino a seguir (Twitter, por ejemplo). – Trein

4

He usado pares similares para uno de mis proyectos, pero en lugar de RoR utilicé Python. No creo que haya una gran diferencia.

En general, no hay nada específico en este tipo de programación. Dos cosas más importantes que debe tener en cuenta:

  • buena modularidad;
  • protocolo bien pensado entre RoR y Java.

Primero se trata de la descomposición de la funcionalidad exacta entre las partes del sistema. Tenemos algunos problemas por no entender qué parte de un trabajo debe realizar Java y qué parte de Python. En general, debe unir todas las funciones que están cerca unas de otras, y las cosas que están lejos deben estar conectadas en muy pocos lugares. Supongo que conoces las reglas de una buena modularidad, pero en el caso de componer idiomas diferentes, esto debe pensarse con mucho más cuidado. También puede estar interesado en crear varios servicios distintos de Java (por ejemplo, uno para el almacenamiento en caché de la base de datos y otro para el resto) para poder combinarlos libremente o incluso utilizarlos en otros proyectos más adelante.

En segundo lugar, se trata de la comunicación entre sus piezas. Puedo ver dos formas de comunicación: a través de una base de datos y a través de un protocolo de red puro. Los primeros necesitan alguna comunicación de red de todos modos, por lo que utilizamos un protocolo de red puro, sin ninguna otra forma de conectar partes.
Experimentamos mucho con SOAP, pero generó cientos de errores: este protocolo está bastante bien para conectar servicios escritos en un idioma (id Java a Java), pero es terrible para conectar servicios en diferentes idiomas: herramientas automáticas para generar WSDL dio resultados diferentes para Java y Python, y la creación manual de esquema fue difícil y laboriosa.
Así que solíamos REST. Utiliza todas las funciones del protocolo HTTP, como los cuatro métodos HTTP principales (POST, GET, PUT, DELETE), códigos de error y muchas otras cosas, por lo que cubre casi todo lo que desee. La única restricción con REST es que no puede contener el estado, por lo que puede necesitar implementar su propio mecanismo de sesiones.
Si no está muy cómodo con REST y busca algún ejemplo real, vea Facebook Graph API y para implementar servicios REST en Java puede usar Restlets.

+0

Gran comentario sobre la modularidad y la comunicación, gracias. ¿Tomó la decisión consciente de utilizar REST sobre las alternativas de JSON? Si es así, ¿cuál fue tu línea de pensamiento allí? – Ian

+0

¿Quiere decir por qué usamos REST _en lugar de_ JSON? Nosotros no. REST es solo una arquitectura, puede usar cualquier representación para transferir datos. Tuvimos que usar XML (necesitábamos hacer que nuestro servicio estuviera disponible para otro equipo de desarrolladores), pero en general es una buena práctica usar el modelo REST con JSON como representación principal. Por ejemplo, para trabajar con la tabla 'Foo' en DB make url'/foo/ ', use el método' PUT' para agregar una nueva instancia 'Foo',' POST' para actualizar, 'DELETE' para eliminar y' GET' para recuperar, eso es REST. Y los datos reales de todas estas URL se pueden representar como cadenas JSON. Lea alguna información acerca de REST;) – ffriend

+0

Y nuevamente, vea Facebook Graph API: usan arquitectura REST y objetos representados por JSON. – ffriend

2

Le recomiendo encarecidamente que considere tener el frontend y el back-end en la misma JVM por motivos de rendimiento.

Para rieles, JRuby puede ejecutar Rails, y puede tenerlo en un contenedor Java EE que proporciona una comunicación rápida entre los componentes.

Tener múltiples arquitecturas que no se ejecutan en el mismo proceso requiere que haga una comunicación basada en red que tarda mucho, mucho más tiempo que simplemente pasar una referencia a un objeto (no espero que quiera usar memoria compartida).

+0

La comunicación y el rendimiento asociado son definitivamente una gran parte de la decisión. ¿Cómo califico/cuantifico este rendimiento? Una aplicación web ya tiene llamadas de red a cosas como memcached y, tal vez, solr. El rendimiento alcanzado allí no ha sido notable para mí. ¿Será diferente para hacer llamadas a otros servicios de Java? – Ian

+0

En cuanto a JRuby, veo que la integración con Spring 3 no es muy fácil desde la documentación. Además, el soporte de la comunidad como complementos para JRuby no está tan desarrollado. Nada que pueda cuantificar, solo un sentimiento. ¿Tienes experiencias con esto? – Ian

+0

ørn Ravn Anderse: cada vez que selecciona datos de DB, realiza una comunicación de red, piénselo. Sí, es más lento que pasar una referencia, pero no tan crucial. – ffriend

6

Nunca he hecho ningún desarrollo de raíles, pero aquí están mis pensamientos. ¿Por qué no usar Grails? He realizado una buena cantidad de desarrollo de Grails y funciona bien para la creación rápida de prototipos. También ofrece toda la potencia de Java, Spring e Hibernate. En lugar de ocuparse de la comunicación entre dos tecnologías diferentes, podría aprovechar el hecho de que Grails utiliza Spring e Hibernate bajo las coberturas para lidiar con el almacenamiento en caché, así como con cualquier otro requisito que estas tecnologías admitan. Si tienes desarrolladores de Java, Grails no debería ser difícil de recoger. La historia del plugin de Grails es decente. Todos ellos están almacenados en un lugar central y son fáciles de obtener, pero la calidad varía según el autor del complemento. También debe recordar que, dado que Grails usa Groovy, que es sintácticamente similar a Java y se ejecuta en la JVM, es muy fácil usar el código de Java existente, incluida la multitud de bibliotecas de Java disponibles. No lo sé con certeza, pero supongo que hay muchas más librerías para usar con Java y allí con Grails están disponibles para el lenguaje Ruby y Rails. No puedo hacer una llamada de uso de recursos para ti, pero mi pregunta sería ¿cuántas personas tienes con experiencia en el diseño de sistemas Rails que usan Java en el back-end con todos los inconvenientes que irán junto con eso? Puede encontrar que no tiene a nadie que sea experto en la depuración cuando algo falla en la comunicación entre las dos tecnologías.

+0

Grails definitivamente tiene sentido como alternativa. Es más bien un dilema de recursos humanos para mí en ese momento. Tenemos algunos expertos en Java y algunos expertos en Rails. Usar Grails provocaría que ambas partes necesitaran aumentar. Al menos en ambos lados, algunas personas sabrán los pequeños problemas en lugar de tener a todos en un nuevo territorio. La solución tiene mucho sentido. Simplemente no me he convencido acerca de la compensación. ¿Pensamientos? – Ian

+0

Otro aspecto que no tengo experiencia suficiente para llamar es el soporte de plugin/gem para Grails. ¿Qué porcentaje de plugins/gems que puedo encontrar en Rails también podré encontrar en Grails? A grandes rasgos, por supuesto. – Ian

+0

@lan, ¿qué porcentaje de los complementos de Rails aún son compatibles con la última versión de Rails? casi ninguno ... – Kedare

1

Twitter.com supuestamente utiliza un backend Java y Rails para su interfaz web. Aquí están algunos recursos:

http://www.radicalbehavior.com/5-question-interview-with-twitter-developer-alex-payne/

http://blog.adsdevshop.com/2008/05/02/twitter-is-not-abandoning-rails/

http://twitter.com/#!/ev/status/801530348

Más específicamente, se usan Scala en el backend (que compila a código de bytes de Java):

http://www.artima.com/scalazine/articles/twitter_on_scala.html

No creo que haya nada de malo en esta aprobación ach. Sin embargo, admitirá dos plataformas/máquinas virtuales diferentes. He visto este tipo de situaciones como resultado de una especie de fractura de experiencia dentro de una organización. Y terminas pagando mucho para tener dos conjuntos de experiencia en casa.

Si le preocupa el problema de la especialización en segmentación, le sugiero que ejecute JRuby of Rails. Ahora es muy maduro y funciona mejor que Rails on Ruby 1.8.x.

1

Hemos utilizado Ruby on Rails para front-end y Core-Java SOAP Api para back-end. Funcionó muy bien.

El problema principal no es con el rendimiento sino con las personas. Es muy difícil contratar a expertos en Ruby on Rails para todo, en su lugar contratan pocos o pueden moldear fácilmente para aprender la interfaz de usuario de Rails.

Como punto de partida de inicio, es la mejor estrategia. Muchos creen que ROR es mejor para las startups ... pero muy pocos lo sabían porque en la mayoría de las multinacionales usamos Java, por lo que existe la presión de aprender Rails y Code, o contratar muy pocos desarrolladores de ROR. Por lo tanto, en su lugar puede usar ROR para frontend (solo algunas personas lo hacen, o es fácil de aprender) y usar desarrolladores experimentados de Java para actualizaciones de bases de datos y lógica de negocios.