Вызов связки REST API в распределенной среде - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть логика приложения в библиотеке 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.

Существуют ли какие-либо существующие технологии / службы, которые можно было бы использовать для предотвращения недопустимого одновременного выполнения и при этом иметь возможность масштабировать службу в горизонтальном направлении?

1 Ответ

0 голосов
/ 06 сентября 2018

Если вы управляете всеми клиентами, получающими доступ к этому API, вы можете попробовать и сериализовать все обращения к одному и тому же ресурсу с помощью согласованного хеширования - данный ресурс всегда будет обрабатываться одной и той же машиной, а затем вы ' Нужно только приобрести локальный замок.

Если есть другие клиенты, которые обращаются к этому API одновременно, и API не предлагает достаточную выразительность для ваших операций (например, позволяет только установить A в 10, вместо того, чтобы говорить увеличение A на 1), а также любые условные обновления / обновления с тестированием и набором (например, установите A на 10, если его предыдущее значение 9), а также транзакции с несколькими ключами (например, увеличение A на 1 и уменьшением B на 2), ни блокировками ... вам может не повезти, поскольку нет способа гарантировать желаемую недвижимость.

...