Contesto
A causa dell'apolidia dello stile architettonico REST che implica che ogni richiesta è completamente indipendente, il server non memorizza mai alcuna informazione sul client.
Pertanto, il controllo pessimistico della concorrenza non è adatto perché richiederebbe a quel server store quale client ottiene il blocco su una risorsa. Vengono quindi utilizzati controlli di concorrenza ottimistici, con l'aiuto Etag
dell'intestazione. (a proposito, come ho chiesto lì /programming/30080634/concurrency-in-a-rest-api )
Problema
Il problema principale con un meccanismo di controllo della concorrenza ottimista è che si consente a tutti i tempi, tutti i client, di eseguire qualsiasi operazione.
E vorrei evitarlo senza infrangere il principio di apolidia di REST. Voglio dire che tutti i clienti non possono eseguire alcuna operazione in qualsiasi momento.
Domanda
Nella mia mente, sarebbe possibile con un semi-ottimista meccanismo di controllo della concorrenza, come quella:
- I clienti possono richiedere un token
- È possibile generare un solo token e ha un periodo di validità limitato
- Per eseguire operazioni sulle risorse (come POST o PUT ), il client deve fornire questo token come parte del corpo (o intestazione?) Della richiesta. Il client che non ha il token non può eseguire queste operazioni.
È molto simile al controllo di concorrenza ottimista, tranne per il fatto che solo un client può eseguire alcune operazioni (quello che ha ottenuto il token) ... al contrario di "tutti i client possono eseguire tutte le operazioni".
Questo meccanismo è compatibile con uno stile architettonico REST? Si rompe qualcuno dei suoi vincoli? Stavo pensando di fare una domanda su SO, ma questa sembra più una domanda di alto livello, relativa alla progettazione del software.
Etag
? Con Etag
te non sei mai sicuro che le tue operazioni saranno complete, potresti avere una situazione in cui non eseguirai mai alcuna operazione. Con un lucchetto, sei sicuro almeno di eseguire l'operazione. Quindi avere un semplice blocco è solo una via di mezzo tra un ambiente in cui possono verificarsi "conflitti elevati" e "conflitti rari".
Transaction
esplicitamente una risorsa.