2010-09-06 12 views
9

Supongamos que tengo 2 servidores.¿La mejor manera de crear API REST para tareas de larga duración?

El primero es un servicio que proporciona algunos cálculos, que pueden durar mucho tiempo (de minutos a horas).

El segundo servidor utilizará este servicio para tener algunos datos calculados.

Estoy tratando de diseñar una API REST para el primer servidor y hasta ahora todo bien. Pero me gustaría escuchar algunas opiniones sobre cómo modelar las notificaciones cuando la tarea de larga duración haya finalizado.

Consideré 2 enfoques hasta ahora:

  1. sondeo - el segundo servidor le pedirá de vez en cuando por el resultado.
  2. Devolución de llamada: el segundo servidor configurará un uri para que el primero llame después de que finalice. Pero esto huele un poco en REST API.

¿Qué opinas?

Respuesta

4

Además de lo que tengo already answered en this similar question, sugiero usar el protocolo de publicación Atom para la notificación (puede publicar en su segundo servidor).

+0

¿Sería inherentemente incorrecto utilizar el enfoque de devolución de llamada? Tengo un problema muy similar (excepto que mi servicio puede tardar entre 2 y 500 segundos para responder) y usar una devolución de llamada parece mucho más simple que el sondeo – Johan

+0

Una breve explicación y un enlace a una explicación del Protocolo de publicación Atom mejorarían en gran medida esta respuesta . – Geerten

1

Si usa Python, puede aprovechar RabbitMQ y Celery para hacer el trabajo. Apio le permite crear un elemento en una cola y luego pausar la ejecución de lo que sea que esté ejecutando (es decir, Django) de modo que pueda consumir la salida del procesador de cola a medida que esté disponible. No hay necesidad de sondeo O devoluciones de llamada.

+0

A menos que entienda el apio (es decir, usted es el autor), usaría Rabbit MQ + pika directamente y se ahorraría una carga de dolor (desaparición de excepciones, encadenamiento que simplemente no funciona, problemas de compatibilidad extraños con gevent etc.). Puede que funcione, pero si está haciendo algo remotamente complejo, el apio lo está ocultando de una gran cantidad de detalles de implementación de trabajo real que podría necesitar. – pip

7

Para su situación, elegiría el sondeo. Cuando el segundo servidor realiza la solicitud inicial para crear el trabajo en el primer servidor, debe obtener una respuesta que tenga la url de la página de estado eventual. El segundo servidor entonces sondea esa url cada 5-15 minutos para verificar el estado del trabajo. Si el primer servidor hace que la url sea una fuente RSS o Atom, los usuarios también pueden señalar sus lectores RSS en la misma URL y averiguar por sí mismos si el trabajo está terminado. Es una verdadera victoria cuando las personas y las máquinas pueden obtener información de una sola fuente.

Cuestiones relacionadas