"回滚"更改的最佳方法是什么?

Env*_*vin 5 java spring transactions atomicity

好吧,所以我有一个Spring应用程序,它接受网络表示并启动虚拟机来表示传入的网络.

它使用低级API来调出VM,不涉及数据库.

我需要弄清楚如何处理用户提交10个节点(或任意数量)网络模型并且应用程序通过并构建网络(启动VM)的情况,如果节点无法启动我想要能够对此做出反应.我希望能够回滚我的更改(即销毁所有已创建的节点).

我被告知我需要查看"事务",但我不确定当我不使用数据库时是否适用于这种情况.

作为旁注,如果用户发送该请求,我确实有逻辑来取消节点.

我的问题是 - 我该如何处理?

此外,这是这个问题的最佳堆栈溢出吗?

小智 4

您似乎确实在寻找事务行为,特别是原子性(“全有或全无”)。但通常“交易”意味着某些保证(特别是围绕 ACID 属性),在涉及分钟级的人类时间尺度时,这些保证将很难或不可能实现。

也许“带有错误补偿的工作流程”更适合您在这里寻找。

我会手动实现这一点,也许需要工具支持(例如工作流引擎)。启动一个进程来生成网络,并跟踪当前进度,例如创建的虚拟机、正在进行的虚拟机等。如果出现需要回滚的错误,则使用另一个进程来执行清理。清理过程本身的行为可能会失败,因此它可能会在生成“此清理步骤失败”的报告之前重试各个步骤几次。

如果涉及共享资源,那么您还需要实现某种隔离机制。有时这很简单——例如,DHCP 可以帮助您避免重复的 IP。如果您要更新 DNS 区域文件,那么您需要同步对该文件的访问以避免并发写入。ETC。