¿Marco Scala para un servidor API Rest? [cerrado]

105

Estamos pensando en mover nuestro Rest API Server (está dentro del servicio web, en Symfony PHP) a Scala por varias razones: velocidad, sin gastos generales, menos CPU, menos código, escalabilidad, etc. No conocía Scala hasta varios Hace días, pero he disfrutado de lo que he estado aprendiendo estos días con el libro Scala y todas las publicaciones y preguntas del blog (¡no es tan feo!)

Tengo las siguientes opciones:

  • construir el servidor de API Rest desde cero
  • use un pequeño marco web Scala como Scalatra
  • usar ascensor

Algunas cosas que tendré que usar: solicitudes HTTP, salida JSON, MySQL (datos), OAuth, Memcache (caché), registros, cargas de archivos, estadísticas (tal vez Redis).

¿Qué recomendarías?

fesja
fuente

Respuestas:

87

Sin ningún orden en particular:

oluies
fuente
1
¡Gracias! Verificaré AKKA, ya que parece ser muy ligero y escalable
fesja
1
NB Espero que alguien se las arregle para integrar o portar restfulie.caelum.com.br a Scala. Una opción ahora es usar Restfulie como interfaz para Scala en JRuby.
oluies
3
+1, uso Akka en el trabajo para alimentar un servidor API de alto rendimiento. La desventaja de usar JAX-RS con Akka es que JAX-RS viene cargado con una tonelada de idiosincrasias de Java que no encajan muy bien en un proyecto puro de Scala. Aún así, Akka hace que todo el trato valga la pena.
Max A.
2
Akka es una buena elección. Si está sirviendo JSON, eche un vistazo a Lift JSON. Puedes mezclar y combinar, no hay problema.
andyczerwonka
1
@santiagobasult Yo diría que Play! 2.0 y Play-mini! 2.0 sucedió
oluies
22

Voy a recomendar Unfiltered . Es un framework web idiomático que hace las cosas "a la manera de Scala" y es muy hermoso.

Max A.
fuente
15

Eche un vistazo a Xitrum (soy su autor), proporciona todo lo que enumeró. Su doc es bastante extenso. De README:

Xitrum es un servidor web y marco web Scala asincrónico y agrupado sobre Netty y Hazelcast:

  • La anotación se utiliza para rutas URL, en el espíritu de JAX-RS. No es necesario que declare todas las rutas en un solo lugar.
  • Async, en el espíritu de Netty.
  • Las sesiones se pueden almacenar en cookies o Hazelcast agrupado.
  • Caché en proceso y en clúster, no necesita servidores de caché separados.
  • Comet en proceso y agrupado, no necesita un servidor Comet separado.
Ngoc Dao
fuente
7

Agregaría dos opciones más: akka con soporte JAX-RS incorporado, y simplemente usando JAX-RS directamente (probablemente la implementación de Jersey). Aunque podría decirse que es menos "Scala-y" que otros (confiando en anotaciones para unir parámetros y rutas), JAX-RS es un placer de usar, resolviendo limpiamente todos los problemas de codificación de servicios web con una huella mínima. No lo he usado a través de akka, anticiparía que sería excelente allí, obteniendo una escalabilidad impresionante a través de su implementación basada en la continuación.

Dave Griffith
fuente
¡Gracias! Verificaré AKKA con JAX-RS como @Brent y dijiste. Realmente parece ser muy liviano con una huella mínima, lo cual es realmente importante para una API, si quieres ir realmente rápido.
fesja
1
Tendrá que usar JAX-RS 2.0 (que actualmente es beta) para obtener la escalabilidad, ya que las versiones anteriores se basan en subprocesos desagradables (es decir, la pausa y la reanudación de subprocesos no son compatibles).
Adam Gent
4

Eche un vistazo a Finch , una biblioteca de combinador de Scala para crear servicios HTTP de Finagle . Finch le permite construir puntos finales HTTP complejos a partir del número de bloques básicos predefinidos. De manera similar a los combinadores de analizadores sintácticos, los puntos finales de Finch son fáciles de reutilizar, componer, probar y razonar.

Vladimir Kostyukov
fuente
3

Todas las buenas respuestas hasta ahora. Un punto a favor de Lift es su RestHelper , que puede facilitar la escritura de métodos de API cortos y elegantes. Además, todas las demás cosas que desea hacer deben ser bastante sencillas de implementar en Lift. Dicho esto, Memcache podría no ser necesario.

pr1001
fuente
¡Gracias! ¿Por qué no crees que Memcache es necesaria? Depende por supuesto, pero tenemos varias consultas que es muy probable que se hagan de forma constante, así que es hora de que ganemos y carguemos menos en la base de datos.
fesja
Realmente me estoy saliendo de lo que dijo ayer David Pollak. Básicamente, el almacenamiento en caché dentro de Lift elimina muchos casos de uso de Memcache. Aquí está su mensaje y hay algunas otras publicaciones en el hilo sobre Memcache
pr1001
2

Un poco tarde en la escena, pero definitivamente recomendaría usar el marco Bowler para la creación de API REST. ¡Es pequeño, directo y compatible con la conversión automática de clases de casos!

cracked_all
fuente