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.
fuente
Transaction
explícitamente como un Recurso.Etag
? ConEtag
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".Respuestas:
Nunca debe (como nunca nunca) bloquear ningún recurso mientras espera la interacción del usuario.
En algún momento, algunos de sus usuarios despegarán durante un largo fin de semana dejando algunos registros vitales bloqueados.
Ah, pero no dejarás que eso suceda porque tienes un esquema inteligente de tiempo muerto / resolución de punto muerto; luego, en algún momento, esto saldrá terriblemente mal y un usuario que recibió un mensaje agradable de "su widget ha sido ordenado" gritará en la mesa de ayuda exigiendo saber por qué no se entregó su widget.
La mayoría de las personas pueden lidiar con el mensaje "lo siento, otro usuario acaba de ordenar esta parte".
fuente
El uso de tokens es muy común en las API, estos tokens generalmente se envían como un encabezado y tienen un ciclo de vida claro. Piense, por ejemplo, OAuth.
Independientemente de su lenguaje de programación o marco, las API REST son similares.
Puedo pensar en varios escenarios en los que desea limitar la concurrencia, dos de ellos son:
Varios clientes actualizan los mismos recursos como una fila de base de datos. Por ejemplo: dos solicitudes simultáneas, una elimina un registro y la otra intenta actualizar el mismo registro. Dependiendo de su base de datos y de cómo lo haya configurado, es posible que obtenga un bloqueo en los registros o una operación no válida ya que los datos serán diferentes o no existirán.
Un súper usuario o administrador que realiza acciones especiales con la API.
¿Qué hacer en estos casos?
Use transacciones en la base de datos, singletons, bloqueos y mecanismos similares para sincronizar el acceso a los recursos.
El token podría funcionar, creo que será mejor si no almacena información sobre el cliente, solo sobre el token en sí. En un paso, puede validar al usuario y asignar el token. Luego, solo valida que el token esté vivo y sea válido. Use un token que se pueda descifrar para obtener información adicional. Puede almacenar si este es un token especial y permitirlo solo a la vez. De esta manera, usted valida el token, no el usuario.
Espero que esto ayude.
fuente
REST solo es demasiado primitivo, de verdad. Puede comenzar con REST, pero eventualmente, su rica aplicación necesitará consultas con combinaciones y actualizaciones con las transacciones. Cada desarrollador que intente agregar estas cosas por su cuenta sería propenso a errores e inconsistente. Afortunadamente, hay un estándar emergente llamado OData que hace exactamente eso. Se superpone a REST y proporciona (1) lenguaje de consulta que permite combinaciones simples utilizando propiedades de navegación (sin tener que exponer claves foráneas) y (2) procesamiento por lotes que incluye conjuntos de cambios atómicos.
Consulte aquí para (1) https://stackoverflow.com/a/3921423/471129 y,
Ver aquí y para (2) https://stackoverflow.com/a/21939972/471129
fuente