Contexto
Devido à falta de estado do estilo de arquitetura REST, cada uma das solicitações fica completamente sozinha, levando o servidor a nunca armazenar informações sobre o cliente.
Portanto, o controle de simultaneidade pessimista não é adequado porque exigiria que o servidor armazene qual cliente obtém o bloqueio em um recurso. O controle de concorrência otimista é então usado, com a ajuda do Etag
cabeçalho. (btw, como eu pedi lá /programming/30080634/concurrency-in-a-rest-api )
Problema
O principal problema com um mecanismo de controle de concorrência otimista é que você permite o tempo todo, todos os clientes, executar quaisquer operações.
E eu gostaria de evitar isso sem violar o princípio da apatridia do REST. Quero dizer que todos os clientes não podem executar nenhuma operação a qualquer momento.
Questão
Na minha opinião, seria possível com um mecanismo de controle de concorrência semi-otimista , assim:
- Os clientes podem solicitar um token
- Somente um token pode ser gerado e tem um período de validade limitado
- Para executar operações em recursos (como POST ou PUT ), o cliente deve fornecer esse token como parte do corpo (ou cabeçalho?) Da solicitação. O cliente que não possui o token não pode executar essas operações.
É muito semelhante ao controle de concorrência otimista, exceto que apenas um cliente pode executar algumas operações (a que recebeu o token) ... ao contrário de "todos os clientes podem executar todas as operações".
Esse mecanismo é compatível com um estilo de arquitetura REST? Ele quebra alguma de suas restrições? Eu estava pensando em perguntar sobre SO, mas isso parece mais uma pergunta de alto nível, relacionada ao design de software.
Etag
? Se Etag
você nunca tiver certeza de que suas operações serão concluídas, você poderá ter uma situação em que nunca executará nenhuma operação. Com uma trava, você tem certeza de pelo menos para executar sua operação. Portanto, ter um bloqueio simples é apenas o meio termo entre um ambiente em que "altos conflitos" e "raros conflitos" podem acontecer.
Transaction
explicitamente como um Recurso.