以RESTful方式转换资源

时间:2017-02-20 16:38:45

标签: rest design-patterns transactions

我目前一直在设计我的端点,以便它们符合REST原则,同时也确保底层数据的完整性。

我有两个资源ShadowUserRealUser,而第一个只有名字,姓氏和电子邮件。 第二个用户拥有更多属性,例如Id,在该ID下,真实用户可以在系统中的其他位置进行寻址。

我的用例是将特定ShadowUser转换为真实用户。

在我脑海中,流程似乎很简单:

  • 获取影子用户/ GET api / ShadowUsers?somePropery = someValue
  • 使用fetched / POST api / RealUsers
  • 创建新的真实用户
  • 删除shadow-users / DELETE api / ShadowUSers?somePropery = someValue

但是当新用户的创建和阴影用户的删除之间出现问题时会发生什么?现在数据不一致。 当只有一个用户时,该示例更加容易,但问题保持不变,因为步骤2和3之间可能存在某些问题,使用户以阴影和真实存在。

所以问题是,如何以“事务”的方式完成这项工作,其中任何事情都是好的,持续存在或出现问题并且基础数据存储中没有任何变化?

是否有可以使用的“最佳实践”或“设计模式”?

1 个答案:

答案 0 :(得分:-1)

也许RESTful API的角色批量收集和发布这些真实用户(我几周前就一个相关问题问了一个问题:Updating RESTful resources against aggregate roots only)。

在API方面,POSTed用户不会被直接处理,但会被排入可靠的消息队列(例如RabbitMQ)。后台进程将订阅整个队列,它将分别处理真实和影子用户的创建和删除。

使用可靠的消息传递系统的关键是您可以实施重试策略。如果操作在完成其工作的过程中被中断,您可以重试它并检测哪些更改仍未完成,以完成任务。

总之,使用这种方法,您可以以事务方式实现该操作。