在分布式环境中调用一堆REST API

问题描述 投票:1回答:1

我在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实例同时执行。如果执行影响不同的资源,则可以同时运行操作。但是,应该按顺序执行对影响相同资源的操作调用。这是因为对REST api的交叉调用可能导致REST服务的状态不一致。例如,如果在ID为3的资源上并发执行OperationA,则可能会发生这种情况:

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

问题是最终端点Y处的资源3处于状态foo,而在所有其他端点处资源处于状态bla。

我可以在调用REST api之前获取分布式锁,但是我还需要支持REST api本身作为Martin Kleppmann pointed out(以fencing令牌的形式)这是不可能的,因为我无法控制REST api。

是否有一些现有的技术/服务可用于防止不可接受的并发执行,并且仍然能够横向扩展服务?

rest architecture microservices distributed-computing distributed
1个回答
1
投票

如果您控制访问此API的所有客户端,您可以尝试通过consistent hashing序列化对同一资源的所有访问 - 给定资源将始终由同一台机器处理,然后您只需要获取本地锁。

如果有其他客户同时访问此API,并且API没有为您的操作提供足够的表现力(例如,只允许将A设置为10,而不是允许通过A来增加1),也不允许任何条件/测试 - 和-set更新(例如,如果A的前一个值是10,则将9设置为A),也不是多键事务(例如1增加B,qazxswpoi减2)也不锁定......你可能会因为无法保证而失去运气你想要的属性。

© www.soinside.com 2019 - 2024. All rights reserved.