2012-01-20 8 views
10

Estoy pensando en escribir una aplicación web con Rails. Cada solicitud hecha por el usuario dependerá de que se llame a una API externa. Esta API externa puede ser aleatoriamente muy lenta (2-3 segundos), y obviamente afectará una solicitud individual.Bloqueo de IO/Ruby on Rails

Durante este tiempo cuando el código está esperando que la API externa regrese, ¿se bloquearán las solicitudes de los usuarios?

Sólo una aclaración, ya que parece que hay cierta confusión, este es el modelo que estoy anticipando:

  1. Alice hace solicitud a mi aplicación web. Para cumplir esto, se realiza una llamada al servidor API A. El servidor API A es lento y tarda 3 segundos en completarse.
  2. Durante este tiempo de espera cuando la aplicación Rails está llamando servidor de la API A, Bob hace una petición que tiene que hacer una petición al servidor de la API B.

¿Es el Rubí (1.9.3) intérprete (o algo en el marco de Rails 3.x) va a bloquear la solicitud de Bob, y le pide que espere hasta que se complete la solicitud de Alice.

+0

Tengo una pregunta similar en realidad ... pero me pregunto, ¿realiza consultas DB desde su aplicación de rieles a través de activerecord, o los datos son puramente impulsados ​​desde el servidor API backend que hacen la consulta DB y devuelven el resultado a su rieles front-end? –

+0

@BennyTjia Ambos. Una solicitud individual usará datos almacenados localmente y datos únicos devueltos por el servidor API. – Matty

Respuesta

7

Si solo utiliza un servidor de una sola hebra y sin vértigo (o no utiliza E/S con un servidor con evented), sí. Entre otras soluciones que usan Thin y EM-Synchrony evitarán esto.

elaborar, sobre la base de su actualización

No, ninguno de Ruby Rails ni va a hacer que su aplicación para bloquear. Sin embargo, omitió la parte que lo hará: el servidor web. Usted necesita múltiples procesos, múltiples hilos o un servidor con evented junto con hacer sus solicitudes de servicio web con una biblioteca de E/S vistos.

@alexd descrito mediante procesos múltiples. Personalmente, estoy a favor de un servidor con evented porque no necesito saber/anticipar cuántas solicitudes concurrentes podría tener (o usar algo que genere procesos basados ​​en la carga). Un solo proceso nginx al frente de un solo proceso thin puede server toneladas de solicitudes paralelas.

+1

Todavía se encontrará con latencia de red. –

+3

_Latencia de red? Si quiere decir que el usuario actual se verá obligado a esperar, por supuesto que lo harán (pero supongo que por la forma en que escribió la pregunta, eso es inevitable). Leí la pregunta no sobre cómo evitar la latencia para el usuario que accede al servicio externo, sino sobre el bloqueo de otras solicitudes simultáneas. – smparkes

+0

@smparkes He agregado más aclaraciones a la pregunta con respecto a este – Matty

0

Es muy probable que sí. Hay formas de evitar esto, obviamente, pero ninguno de ellos es fácil.

La mejor pregunta es, ¿por qué necesita presionar la API externa en cada solicitud? ¿Por qué no implementar una capa de caché entre su aplicación Rails y la API externa y usar eso para la mayoría de las solicitudes?

De esta manera, con un poco de lógica personalizada para caducar el caché, tendrá una aplicación rápida de Rails y aún podrá aprovechar el servicio API externo.

+0

Los datos devueltos cambian con cada solicitud. El almacenamiento en caché no es posible. – Matty

+0

Entonces, ¿qué dices es que tu API es tu base de datos? Eso no suena factible a largo plazo ... –

+0

La API no actúa como una base de datos. – Matty

3

La respuesta a su pregunta depende del servidor en el que se ejecuta su aplicación Rails. ¿Qué estás usando ahora? ¿Delgado? ¿Unicornio? Apache + Pasajero?

Recomiendo sinceramente Unicorn para su situación: hace que sea muy fácil ejecutar múltiples procesos de servidor en paralelo, y puede configurar el número de procesos paralelos simplemente cambiando un número en un archivo de configuración. Mientras un trabajador de Unicornio está manejando la solicitud de alta latencia de Alice, otro trabajador de Unicorn puede usar sus ciclos de CPU gratuitos para manejar la solicitud de Bob.