我们正在开发一个REST API,其中客户端(应用程序)将调用我们的REST API。
客户端(应用程序)将使用回滚功能处理业务逻辑(例如,如果更新“发货”服务[通过]并更新“库存”服务[失败],客户端可以回滚)。
有许多关于TCC [尝试/确认/取消]的在线文章描述了通过POST / DELETE方法保留/取消资源但没有描述如何处理PUT请求(例如,更新“Stock”计数为1并且回滚失败)。
任何人都知道处理PUT回滚的解决方案(因为PUT请求会覆盖原始数据,我们如何回滚到原始数据)?
答案 0 :(得分:0)
TCC只是一个使用HTTP / REST实现事务行为的概念。它涵盖了如何为交易建模(包括超时和取消)的标准。在此模型中,事务绑定到具有ID的任何类型的资源,因此您可以随时确认或取消它。由于交易超时,您最终可能会获得无效或不再存在的交易。
从事务开始到结束的所有操作都由您决定。但是您需要一些东西来识别交易。由于使用PUT覆盖资源并不能单独创建资源对象,因此您需要一种虚拟资源来实现。
您可以创建资源的新版本(可能使用locking)(entities
只是此处的占位符):
PUT /entities/42
->链接rel:tcc
,href:/entities/42/version/7
PUT application/tcc /entities/42/version/7
DELETE /entities/42/version/7
如果有会话ID,也可以考虑使用一种会话ID,而不是一个版本。
答案 1 :(得分:0)
对于每个TCC模式,MTLDepthStencilDescriptor
操作使用confirm
作为幂等特性。如果在部分保留被确认而其他保留已过期的情况下实现这种行为,则可以使用PUT
操作来模拟回滚行为,以便每个已确认的参与者链接将与另一个cancel
请求一起发送。我写了tutorial article,介绍了在Booking系统中使用Java的最小TCC实现。您可以在此处参考实现。