cómo implementar llamadas de servicio web idempotent

8

Estoy desarrollando una solución basada en wcf para una capa de servicio web que utilizarán dispositivos móviles "conectados ocasionalmente". El servicio no utilizará la puesta en cola (en esta etapa) debido a las complejidades adicionales, por lo que en su lugar estará operando un enfoque simple de Solicitud / Respuesta.

Por supuesto, al ser un dispositivo móvil, es posible que los dispositivos se salgan de la señal de inserción / actualización. El servicio web en sí puede haber completado la transacción, pero el cliente nunca recibirá este mensaje. Debido a esto, reenviará la solicitud, momento en el que el servidor debe reconocerla como una solicitud duplicada y devolver la misma respuesta que intentó en la primera instancia.

Por lo tanto, estoy tratando de hacer que los servicios sean idempotentes. Para lograr esto, estoy implementando objetos DTO de parámetros de solicitud, que consisten en el ID de solicitud, más los parámetros necesarios para completar la llamada.

Sin embargo, mi dificultad está en implementar una forma de monitorear los identificadores de solicitud. Una vez que el servicio está actualmente sin estado, la única manera que puedo prever actualmente es tener una tabla de solicitud de servicio en la base de datos, que tomará el RequestID como principal. Obviamente, consultar sobre esto indicará si la solicitud ya se ha procesado, ya que el cliente enviará el mismo RequestID. Pero el servicio también necesita saber qué mensaje enviar. En el caso de una inserción / actualización, la ID raíz agregada afectada también deberá almacenarse en algún lugar, ya sea directamente en la tabla de solicitud, o en una tabla RequestToObjectLookup

Por lo tanto, me pregunto si hay una mejor manera de implementar esto. Mi opinión es tener una (s) tabla (s) de solicitud de servicio (específicas para el servicio), que almacena solicitudes, información adicional , y también una búsqueda de la identificación del objeto del resultado (en guardar / insertar / actualizar). Entonces, cuando entra una nueva solicitud, esta tabla se puede consultar primero antes de continuar con el resto de la solicitud, ya sea para guardar o simplemente devolver el objeto actualizado anteriormente (que se aplicó en el primer intento de solicitud). / p>

También estoy pensando (como se indicó) que solo necesito mantener el ID agregado de raíz al que se hace referencia con la solicitud, ya que solo debería poder usar las relaciones para obtener el resto de la información.

    
pregunta Milambardo 04.11.2014 - 13:49

1 respuesta

2

La eliminación se puede hacer idempotente permitiendo solo la eliminación basada en ID. Deberá tener alguna forma para que las identificaciones permanezcan "en uso" y quizás caduquen.

Con tal sistema de reserva; se puede crear un objeto reservando primero un ID y luego una segunda llamada para crear el objeto con ese ID (esencialmente una actualización del nuevo objeto vacío). Cuando se solicita un ID, el servidor tomará cualquier ID libre y creará un objeto sin inicializar con ese ID, la segunda llamada para inicializar incluirá el ID devuelto anteriormente (más todos los datos requeridos). Esto significa que la segunda llamada es en esencia una llamada de actualización que es idem potente en sí misma (llamarla con los mismos datos varias veces dará el mismo resultado).

Si la reserva se realiza varias veces, se devuelven múltiples ID y se mantendrá el objeto inicializado. Estos objetos no inicializados pueden ser limpiados por un rhoomba después de algún tiempo automáticamente.

Esto pone la responsabilidad en el cliente para garantizar que si obtienen una identificación, entonces son responsables de llamar a la inicialización. Si el cliente se cae de la mitad de la transacción, debe mantener su propio registro para las operaciones, de modo que sepa, por ejemplo, que obtuvo una ID y estaba ocupado con la inicialización del objeto.

La actualización es más difícil de hacer idempotent, pero una operación de comparación y configuración (con resultado verdadero / falso) ayudará.

    
respondido por el ratchet freak 04.11.2014 - 17:04

Lea otras preguntas en las etiquetas