2010-07-10 10 views
6

Estoy trabajando con un protocolo persistente cliente/servidor y necesito diseñar una puerta de enlace RESTful. No tengo mucha experiencia en el diseño de interfaces REST y no entiendo cómo debo manejar (de manera RESTANTE) los ID de sesión necesarios para mantener las conexiones persistentes en el servidor y cómo debería representar el estado del servidor como recursos.¿Cómo diseñar una puerta de enlace HTTP RESTful para un protocolo que requiere conexiones persistentes?

Estoy preguntando esto porque no quiero terminar con un resultado RPC-ish que parece "RESTful".

Contexto específico del problema: Quiero mejorar la pasarela ZooKeeper REST existente para admitir nodos y relojes efímeros. Existe un nodo efímero mientras el cliente está conectado al servidor.

Gracias.

+0

Me gustaría establecer una recompensa por esta pregunta. ¿Cómo puedo hacer esto? –

+0

Supongo que solo puede establecer una recompensa si no acepta una respuesta dentro de unos días. – ibz

+0

¿Por qué se hizo esto una wiki comunitaria? –

Respuesta

4

La forma en que he hecho esto en el pasado sigue un patrón de "ticket" o "recibo". El servicio REST acepta solicitudes de un recurso (un nombre de informe, un znode, etc.) y devuelve un ticket. Este ticket (usualmente un UUID o algo similar) se puede usar para representar una sesión. Las solicitudes posteriores utilizan este ticket para verificar el estado de sus solicitudes. Para garantizar el vencimiento correcto de las multas, se produce uno de los dos casos; puede agotar los tickets o, al recibir un resultado, el cliente debe devolver un ACK (acuse de recibo) al servicio.

ex.

Solicitud: GET/cuidador del zoológico/znode/efímera/foo Respuesta: 1234-1234-1234-1234

Solicitud: GET/cuidador del zoológico/estado/1234-1234-1234-1234 Respuesta: Trabajo (o disponible o bloqueado o NOTREADY o fallidos ...)

Solicitud: GET/cuidador del zoológico/estado/1234-1234-1234-1234 Respuesta: Adquirida (o disponibles o bien o el éxito o algún valor (s) ...)

Solicitud: GET/zookeeper/acknowledge/1234-1234-1234-1234 Respuesta: Aceptar (o boleto DESCONOCIDO, etc.)

mensajes interesantes manejabilidad:

Solicitud: GET/zookeeper/sesiones (o entradas)/ Respuesta: [1234, 5668, ...]

Solicitud : GET/zookeeper/kill/ Respuesta: OK (o UNKNOWN o FAILED ...)

Esto ha funcionado muy, muy bien. Esto significa, sin embargo, que el servicio REST es con estado, lo que hace que el equilibrio de carga sea más complicado. Utilicé un protocolo que asegura que se devuelva una identificación de servidor con cada respuesta y si el cliente recibe una identificación de servidor diferente y una de DESCONOCIMIENTO, usted asume que el servicio con el que estaba hablando ha muerto y comienza de nuevo. Esto implica un equilibrio de carga adhesiva (es decir, el round-robin no funcionaría aquí). El servicio REST debe ser de subprocesos múltiples para admitir la realización de estas solicitudes en paralelo y proporcionar acceso a una base de datos de tickets (generalmente en memoria, estructura de datos hashtable sincronizada), así como un hilo de tiempo de espera de sesión/ticket.

Espero que esto ayude.

+0

Gracias por responder tan rápido. Estaba pensando en una solución similar. –

Cuestiones relacionadas