Is concurrency and idempotency mutually exclusive for a REST web service or can it be done so a service can be both concurrent and idempotent?
Sì, naturalmente
User A send same request, with Person.Version = 2 value. It fails because you expect the Person.Version value 3.
Penso che tu stia confondendo un paio di idee diverse.
Da Gregor Hohpe
The term idempotent is used in mathematics to describe a function that produces the same result if it is applied to itself, i.e. f(x) = f(f(x)).
In Messaging this concepts translates into the a message that has the same effect whether it is received once or multiple times. This means that a message can safely be resent without causing any problems even if the receiver receives duplicates of the same message.
Quindi la prima cosa da notare nel tuo sistema è che l'effetto sul ricevitore di inviare lo stesso messaggio due volte è lo stesso di inviarlo esattamente una volta.
Il vantaggio è che è sicuro che il mittente ripeta il messaggio tutte le volte che è necessario per ricevere ack .
Ora, nel tuo esempio, sembra che ti aspetti qualcosa oltre a ciò, ovvero che il messaggio ripetuto genera la stessa risposta. Questa è una proprietà fantastica per il tuo sistema, ma richiede un po 'più di lavoro.
La trama di base è che il tuo server riceve il messaggio duplicato e controlla se è già stato gestito. Un approccio ingenuo sarebbe quello di esaminare la versione e verificare se la modifica applicata in questa versione è già stata applicata.
In particolare, il server riceve il secondo messaggio, vede che è già nella versione 2, vede che il nome è attualmente uguale a "Person X" e restituisce successo!
Non è una grande risposta se qualcun altro scivola in un'altra modifica tra i messaggi duplicati.
Una vera implementazione è più complicata - la forma base è di tenere traccia delle risposte che invii e quando ricevi un messaggio duplicato, rispondi alla risposta stessa che hai inviato prima . Udi Dahan copre questo approccio. La persistenza delle risposte è nel modello di dominio, quindi la messaggistica è ancora stateless, che soddisfa il vincolo REST.