REST è limitato solo al controllo ottimistico della concorrenza?

9

Contesto

A causa dell'apolidia dello stile architettonico REST che implica che ogni richiesta è completamente isolata, il server principale non memorizza mai alcuna informazione sul client.

Quindi, il controllo della concorrenza pessimistico non è adatto perché richiederebbe che il server memorizzi quale client ottiene il lock su una risorsa. Viene quindi utilizzato il controllo ottimistico della concorrenza, con l'aiuto dell'intestazione Etag . (btw, come ho chiesto il link )

Problema

Il problema principale con un meccanismo ottimistico di controllo della concorrenza è che tu permetti sempre, tutti i client, di eseguire qualsiasi operazione.

E vorrei evitarlo senza rompere il principio di apolidia di REST. Voglio dire che tutti i client non possono eseguire alcuna operazione in qualsiasi momento.

Domanda

Nella mia mente, sarebbe possibile con un meccanismo di controllo della concorrenza semi-ottimistico , come quello:

  • I client possono richiedere un token
  • È possibile generare un solo token e ha un periodo di validità limitato
  • Per eseguire operazioni su risorse (come POST o PUT ), il client deve fornire questo token come parte del corpo (o dell'intestazione?) della richiesta. Il client che non ha il token non può eseguire queste operazioni.

È molto simile al controllo ottimistico della concorrenza, tranne che solo un client può eseguire alcune operazioni (quella che ha ottenuto il token) ... al contrario di "tutti i client possono eseguire tutte le operazioni".

Questo meccanismo è compatibile con uno stile architettonico REST? Rompe nessuno dei suoi limiti? Stavo pensando di chiedere su SO, ma questa sembra più una domanda di alto livello, relativa alla progettazione del software.

    
posta AilurusFulgens 23.06.2015 - 15:41
fonte

3 risposte

3

Non dovresti mai (come mai e poi mai) bloccare alcuna risorsa mentre aspetti un'interazione con l'utente.

Ad un certo punto alcuni dei tuoi utenti decolleranno per un lungo weekend lasciando bloccati alcuni record vitali.

Ah, ma non lascerai che ciò accada perché hai qualche schema di risoluzione time-out / deadlock intelligente; poi ad un certo punto questo andrà terribilmente storto e un utente che ha ricevuto un bel messaggio "il tuo widget è stato ordinato" urlerà all'help desk chiedendo di sapere perché il suo widget non è stato consegnato.

La maggior parte delle persone può gestire il messaggio "mi dispiace che un altro utente abbia appena ordinato questa parte".

    
risposta data 08.07.2015 - 18:12
fonte
2

L'utilizzo dei token è molto comune nelle API, questi token vengono solitamente inviati come intestazione e hanno un ciclo di vita chiaro. Pensa ad esempio OAuth.

Indipendentemente dal linguaggio di programmazione o dal framework, le API REST sono simili.

Posso pensare a diversi scenari in cui si desidera limitare la concorrenza, due dei quali sono:

  1. Più client che aggiornano le stesse risorse come una riga del database. Ad esempio: due richieste simultanee, una elimina un record e l'altra tenta di aggiornare lo stesso record. A seconda del tuo database e del modo in cui lo hai impostato, potresti ottenere un blocco sui record o un'operazione non valida poiché i dati saranno diversi o non esisteranno.

  2. Un superutente o amministratore che esegue azioni speciali con l'API.

Che cosa fare in questi casi?

  1. Utilizza le transazioni nel database, singleton, blocchi e meccanismi simili per sincronizzare l'accesso alle risorse.

  2. Il token potrebbe funzionare, penso che sarebbe meglio se non memorizzassi le informazioni sul client, solo sul token stesso. In un solo passaggio è possibile convalidare l'utente e assegnare il token. Quindi convalida solo che il token è vivo ed è valido. Utilizzare un token che può essere decodificato per ottenere informazioni aggiuntive. È possibile memorizzare se si tratta di un token speciale e consentire solo alla volta. In questo modo convalidi il token, non l'utente.

Spero che questo aiuti.

    
risposta data 03.07.2015 - 20:09
fonte
0

Il REST da solo è troppo primitivo, davvero. Puoi iniziare con REST, ma alla fine, la tua ricca applicazione avrà bisogno di query con join e aggiornamenti con le transazioni. Ogni sviluppatore che tenta di aggiungere queste cose da solo sarebbe soggetto a errori e inconsistente. Fortunatamente, esiste uno standard emergente chiamato OData che fa proprio questo. Si sovrappone a REST e fornisce (1) il linguaggio di query che consente i join semplici utilizzando le proprietà di navigazione (senza dover esporre chiavi esterne) e, (2) l'elaborazione batch che include i set di modifiche atomiche.

Vedi qui per (1) link , e,

Vedi qui e per (2) link

    
risposta data 09.07.2015 - 03:40
fonte

Leggi altre domande sui tag