У меня есть логика приложения в библиотеке Python. Каждая операция, предоставляемая моей библиотекой, включает вызов REST API один или несколько раз. Итак, у меня есть:
def OperationA(resource_id, params):
Call REST Api /X/resource_id/params
Call REST Api /Y/resource_id/params
Call REST Api /Z/resource_id/params
def OperationB(resource_id params):
Call REST Api /R/resource_id//params
Call REST Api /S/resource_id//params
Call REST Api /T/resource_id//params
Библиотека выполняется в распределенной среде, и операции вызываются в ответ на действия пользователя. Таким образом, возможно, что, например, два экземпляра OperationA выполняются одновременно. Допустимо одновременное выполнение операции, если выполнение влияет на разные ресурсы. Однако вызовы операций, которые влияют на один и тот же ресурс, должны выполняться последовательно. Это связано с тем, что чередование вызовов API REST может привести к несовместимому состоянию в службе REST. Например, это может произойти, если OperationA выполняется одновременно на ресурсе с идентификатором 3:
OperationA(3, "foo"): Call REST Api /X/3/foo
OperationA(3, "bla"): Call REST Api /X/3/bla
OperationA(3, "bla"): Call REST Api /Y/3/bla
OperationA(3, "foo"): Call REST Api /Y/3/foo
OperationA(3, "foo"): Call REST Api /Z/3/foo
OperationA(3, "bla"): Call REST Api /Z/3/bla
Проблема в том, что в конечном ресурсе 3 в конечной точке Y находится состояние foo, тогда как во всех остальных конечных точках ресурс находится в состоянии bla.
Я мог бы получить распределенную блокировку перед вызовом API REST, но мне также понадобилась бы поддержка самого API REST, так как Мартин Клеппманн указал (в виде маркера фехтования), что невозможно, так как у меня нет контроля через REST API.
Существуют ли какие-либо существующие технологии / службы, которые можно было бы использовать для предотвращения недопустимого одновременного выполнения и при этом иметь возможность масштабировать службу в горизонтальном направлении?