Контекст
Через безхарактерність архітектурного стилю REST, який передбачає, що кожен запит стоїть повністю самостійно, ведучий сервер ніколи не зберігає інформацію про клієнта.
Таким чином, песимістичний контроль одночасності не підходить, оскільки він вимагає того серверного магазину, який клієнт отримує блокування на ресурсі. Потім використовується оптимістичний контроль за одночасністю за допомогою Etag
заголовка. (btw, як я запитав там /programming/30080634/concurrency-in-a-rest-api )
Проблема
Основна проблема оптимістичного механізму контролю за сумісністю полягає в тому, що ви дозволяєте весь час, всім клієнтам, виконувати будь-які операції.
І я хотів би цього уникнути, не порушуючи принципу без громадянства REST. Я маю на увазі, що всі клієнти не можуть виконати жодної операції в будь-який час.
Питання
На мій погляд, це було б можливо з полуоптімістіческом механізм управління паралелізмом, як цей:
- Клієнти можуть запитати маркер
- Можна створити лише один маркер і має обмежений термін дії
- Для виконання операцій над ресурсами (такими як POST або PUT ) клієнт повинен надати цей маркер як частину тіла (або заголовка?) Запиту. Клієнт, який не має маркера, не може робити ці операції.
Це дуже схоже з оптимістичним контролем одночасності, за винятком того, що лише один клієнт може робити деякі операції (той, що отримав маркер) ... навпаки "всі клієнти можуть робити всі операції".
Чи сумісний цей механізм із архітектурним стилем REST? Чи порушує це якесь обмеження? Я думав задати питання SO, але це здається питанням на високому рівні, пов'язаним з дизайном програмного забезпечення.
Etag
? Якщо Etag
ви ніколи не впевнені, що ваші операції будуть завершені, у вас може виникнути ситуація, коли ви ніколи не виконаєте жодних операцій. З блокуванням ви впевнені, що принаймні виконаєте свою операцію. Тож наявність простого блокування - це лише середина між середовищем, де можуть статися "високі конфлікти" та "рідкісні конфлікти".
Transaction
чітко моделювати як Ресурс.