문맥
각 요청이 완전히 독립적 인 REST 아키텍처 스타일의 상태 비 저장으로 인해 서버는 클라이언트에 대한 정보를 저장하지 않습니다.
따라서 비관적 동시성 제어는 어떤 클라이언트가 리소스에 대한 잠금을 가져 오는 서버 저장소가 필요하기 때문에 적합하지 않습니다. Etag
헤더 의 도움으로 낙관적 동시성 제어가 사용됩니다 . (btw, 거기에 /programming/30080634/concurrency-in-a-rest-api 요청 )
문제
낙관적 동시성 제어 메커니즘의 주요 문제점은 모든 클라이언트가 모든 작업을 항상 수행 할 수 있다는 것입니다.
그리고 REST의 statelessness 원칙을 어 기지 않고 그것을 피하고 싶습니다. 모든 클라이언트가 언제든지 작업을 수행 할 수 없음을 의미합니다.
질문
내 생각에는 다음과 같은 반 낙관적 동시성 제어 메커니즘을 사용하면 가능합니다.
- 고객은 토큰을 요청할 수 있습니다
- 하나의 토큰 만 생성 할 수 있으며 유효 기간이 제한되어 있습니다.
- 리소스 (예 : POST 또는 PUT ) 에 대한 작업을 수행하려면 클라이언트가 요청의 본문 (또는 헤더?)의 일부로이 토큰을 제공해야합니다. 토큰이없는 클라이언트는 이러한 작업을 수행 할 수 없습니다.
"모든 클라이언트가 모든 작업을 수행 할 수 있습니다"와 반대되는 방식으로 한 클라이언트 만 일부 작업 (토큰을 보유한 작업)을 수행 할 수 있다는 점을 제외하고 낙관적 동시성 제어와 매우 유사합니다.
이 메커니즘은 REST 아키텍처 스타일과 호환됩니까? 제약 조건을 위반합니까? SO에 대해 생각하고 있었지만 소프트웨어 디자인과 관련하여 더 높은 수준의 질문 인 것 같습니다.
Etag
? 와의 차이점 으로 Etag
당신이 당신의 작업이 완료 될 것이라고 결코 확신합니다, 당신은 당신이 어떤 작업을 수행하지 않을 상황이있을 수 있습니다. 잠금 장치를 사용하면 최소한 작업을 수행해야합니다. 따라서 간단한 잠금을 갖는 것은 "높은 충돌"과 "드문 충돌"이 발생할 수있는 환경 사이의 중간에 있습니다.
Transaction
명시 적으로 리소스로 모델링해야합니다 .