Idempotência RESTful

Estou projetando um serviço web RESTful utilizando ROA (arquitetura orientada a recursos).

Estou tentando descobrir uma maneira eficiente de garantir a idempotência para solicitações PUT que criam novos recursos nos casos em que o servidor designa a chave do recurso.

Pelo meu entendimento, a abordagem tradicional é criar um tipo de recurso de transação como / CREATE_PERSON. A interação cliente-servidor para criar um novo recurso de pessoa estaria em duas partes:

Etapa 1: obtenha um ID de transação exclusivo para criar o novo recurso PERSON :::

**Client request:**
POST /CREATE_PERSON

**Server response:**
200 OK
transaction-id:"as8yfasiob"

Etapa 2: Crie o novo recurso de pessoa em uma solicitação garantida como única usando o ID da transação :::

**Client request**
PUT /CREATE_PERSON/{transaction_id}
first_name="Big bubba"

**Server response**
201 Created             // (If the request is a duplicate, it would send this
PersonKey="398u4nsdf"   // same response without creating a new resource.  It
                        // would perhaps send an error response if the was used
                        // on a transaction id non-duplicate request, but I have
                        // control over the client, so I can guarantee that this
                        // won't happen)

O problema que vejo com essa abordagem é que ela requer o envio de duas solicitações ao servidor para realizar uma operação única de criação de um novo recurso PERSON. Isso cria problemas de desempenho, aumentando a chance de o usuário aguardar o cliente concluir sua solicitação.

Eu tenho tentado separar idéias para eliminar a primeira etapa, como pré-enviar IDs de transação a cada solicitação, mas a maioria das minhas idéias tem outros problemas ou envolve sacrificar a apatridia do aplicativo.

Existe uma maneira de fazer isso?

Editar::::::

A solução com a qual acabamos indo foi para o cliente adquirir um UUID e enviá-lo junto com a solicitação. Um UUID é um número muito grande que ocupa o espaço de 16 bytes (2 ^ 128). Ao contrário do que alguém com uma mente de programação possa pensar intuitivamente, é uma prática aceita gerar aleatoriamente um UUID e assumir que esse é um valor único. Isso ocorre porque o número de valores possíveis é tão grande que as chances de gerar dois do mesmo número aleatoriamente são baixas o suficiente para serem praticamente impossíveis.

Uma ressalva é que nossos clientes solicitam um UUID do servidor (GET uuid/) Isso ocorre porque não podemos garantir o ambiente em que nosso cliente está sendo executado. Se houver um problema, como propagação do gerador de números aleatórios no cliente, é muito provável que haja uma colisão de UUID.

questionAnswers(4)

yourAnswerToTheQuestion