Contexto
Debido a la apatridia del estilo arquitectónico REST que implica que cada solicitud se mantiene completamente sola, el servidor líder nunca almacena ninguna información sobre el cliente.
Por lo tanto, el control de concurrencia pesimista no es adecuado porque requeriría que el servidor almacene qué cliente obtiene el bloqueo en un recurso. Luego se utiliza el control de concurrencia optimista, con la ayuda del Etag
encabezado. (por cierto, como pregunté allí /programming/30080634/concurrency-in-a-rest-api )
Problema
El principal problema con un mecanismo de control de concurrencia optimista es que permite que todo el tiempo, todos los clientes, realicen cualquier operación.
Y me gustaría evitar eso sin romper el principio de apatridia de REST. Quiero decir que todos los clientes no pueden realizar ninguna operación en ningún momento.
Pregunta
En mi opinión, sería posible con un mecanismo de control de concurrencia semi-optimista , así:
- Los clientes pueden solicitar un token
- Solo se puede generar un token y tiene un período de validez limitado
- Para realizar operaciones en recursos (como POST o PUT ), el cliente debe proporcionar este token como parte del cuerpo (o encabezado?) De la solicitud. El cliente que no tiene el token no puede realizar estas operaciones.
Es muy similar al control de simultaneidad optimista, excepto que solo un cliente puede hacer algunas operaciones (el que obtuvo el token) ... al contrario de "todos los clientes pueden hacer todas las operaciones".
¿Este mecanismo es compatible con un estilo arquitectónico REST? ¿Rompe alguna de sus restricciones? Estaba pensando en preguntar sobre SO, pero esto parece más una pregunta de alto nivel, relacionada con el diseño de software.
Etag
? Con Etag
usted nunca está seguro de que sus operaciones serán completas, usted podría tener una situación en la que nunca nunca va a realizar ninguna operación. Con un candado, al menos está seguro de realizar su operación. Por lo tanto, tener un bloqueo simple es solo un punto medio entre un entorno donde pueden ocurrir "conflictos altos" y "conflictos raros".
Transaction
explícitamente como un Recurso.