2010-03-31 10 views
19

En Thrift es posible use the oneway modifier especificar una llamada como asincrónica.Devolución de llamada en funciones asíncronas de ahorro?

Aparentemente, no es posible definir una devolución de llamada , que se ejecutará cuando se complete la ejecución de la función.

Parece que la única posibilidad que tengo es darle a mi cliente Thrift (PHP) algunas capacidades de "servidor", de modo que, cuando el cálculo pesado se complete en el servidor, pueda enviarle una notificación . Esto significa que debería tener un nuevo archivo .thrift, con nuevas definiciones, nuevos servicios y todo lo demás y que debería generar el código del lado del servidor php con Thrift.

Incluso si esto es factible, parece una exageración para mí y me pregunto si hay una forma más inteligente de implementar la devolución de llamada.

Esperamos sus comentarios, muchachos.

Respuesta

19

Roberto, lamentablemente el marco Thrift no tiene tal funcionalidad incorporada. No puede ser una serie de alternativas, dependiendo de lo que quiere que su sesión de cliente PHP haga durante el tiempo que normalmente esperaría que el servidor Thrift computacionalmente intensivo respondiera (si no hubiera usado oneway)

Por el momento, me imagino que se encuentra en una situación en la que, tras haber codificado una aplicación web en la que un usuario (o varios usuarios en paralelo) pueden desencadenar una tarea intensiva en cómputo, le gustaría enviar algunos comentarios a dichos usuarios mientras dichas tareas se agitan.

Desde el principio, tiene toda la razón al tratar de evitar la solución que está tratando de evitar. Sus sesiones de PHP cliente no puede dar servicio a una interfaz de devolución de llamada sin bloquear (a menos que cavar su agujero aún más profundo, tratando de utilizar pcntl_fork o algún otro PHP threading band-aid.)

la forma más sencilla y en mi humilde opinión mejor de este es de dos cambio de un modelo orientado a eventos (Quiero ser notificado cuando el servidor se realiza) a un modelo de votación (voy a consultar periódicamente con el servidor si es o no se hace.) Hay varias maneras de implementar un modelo de votación, con múltiples opciones de aplicación en el servidor, así como en los laterales de los clientes, tales como:

  1. durante la fase de invocación:

    • la La sesión del cliente PHP asigna un valor único job_id; la sesión a continuación, hace que la llamada asincrónica onewayvoid compute(..., job_id) al servidor de Ahorro-computacionalmente intensivas,

    - o -

    • la sesión de cliente PHP hace una llamada sincrónica job_id start_compute(...) a el servidor Thrift computacionalmente intensivo; el servidor asigna el valor único job_id, a continuación, genera la tarea computacionalmente intensivas real en un tema/proceso separado, volviendo de inmediato a la sesión del cliente PHP con la job_id asignado
  2. durante la fase de cómputo:

    • los PHP sesión de cliente procede a comprobar periódicamente el estado del trabajo de cálculo intensivo a través de una llamada sincrónicastatus get_status(job_id)al servidor de Ahorro-computacionalmente intensivas,

    - o -

    • la sesión de cliente PHP termina de inmediato con el fin de liberar recursos preciosos, después de pasar sobre la job_id al navegador y también dar instrucciones al navegador para revise periódicamente el estado del trabajo intensivo en computación job_id (p. ej. a través de META REFRESH, oa través de una solicitud XHR (AJAX) de Javascript, etc.); la revisión del navegador genera una sesión de cliente breve PHP que realiza la sincrónicastatus get_status(job_id) llamada al servidor de Ahorro-computacionalmente intensivas, que termina inmediatamente después de reenviar el estado (cualquiera que sea) en el navegador
+2

Este tipo de enfoque parece ser necesario para C++ cliente/servidor también – Ghita

8

Recibí una respuesta en un canal diferente de Stack Overflow. Dado que el autor me dio permiso para publicar aquí su respuesta, pensé que podría ser útil para alguien más en la comunidad.

Oye Roberto,

Sí, esto ha ocurrido en el Apache listas antes. No hay una manera elegante de de hacer lo que está pidiendo con Ahorro. Fundamentalmente no es diseñado para mensajes bidireccionales.

Hay hacks en torno a este, tales como: - sondeo del lado del cliente - invocando send_method(), esperando en el lado del cliente, entonces recv_method(), en lugar de método que se acaba() - haciendo que el cliente también implementar un servidor Thrift

Pero obviamente ninguno de estos es verdadero mensajes bidireccionales. Hemos intentado para mantener las interfaces de Thrift como lo más simples posible y se centró en el caso de uso de núcleo RPC , que ha significado dejando algunas cosas como esta.

Probablemente no sea la respuesta que usted estaba esperando.

Saludos, mcslee

0

Bueno Java tiene Asíncrona Mensaje llamadas a través Futuro Referencia a objeto. Esto se puede implementar en un modelo RPC usando Message Pack. No estoy seguro si PHP tiene algo similar.

3

En lugar de tratar de implementar devoluciones de llamada con Thrift (algo que habría hecho que el protocolo mucho más pesado, supongo), utilizo un servicio de mensajería ligero (STOMP - http://stomp.github.com) para informar al cliente de eventos asincrónicos.

Mi enfoque es que el cliente Thrift se suscribe a un canal STOMP específico, y el servidor Thrift publicará en ese mismo canal siempre que ocurra un evento asincrónico. El cliente puede consultar al servidor para obtener información adicional sobre el evento.

Cuestiones relacionadas