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

5
好的,我有一个Spring应用程序,它接收网络表示并启动虚拟机来表示传入的网络。它使用低级API来启动VM,不涉及数据库。
我需要解决的问题是处理用户提交的10个节点(或任何数量)的网络模型,并构建网络(启动VM),如果节点启动失败,我想能够对此作出反应。我希望能够回滚更改(即销毁创建的所有节点)。
我被告知需要研究“事务”,但我不确定是否适用于这种情况,因为我没有使用数据库。
另外,如果用户发送该请求,我确实有关闭节点的逻辑。
我的问题是 - 如何处理这个问题?
另外,这是此问题的最佳stackoverflow吗?

只有一个StackOverflow,是的,这似乎是适合这个问题的StackExchenge :) 顺便说一句,这是一个很好的问题。我的直觉是也要利用现有的 Transaction 框架 - 因为正如你所提示的那样,它是专门设计用于数据库操作的。我猜想你可以将其调整以使其在此处也可行。 - drew moore
1
也许计算机科学StackExchange是更好的选择。 - hfontanez
糟糕!非常抱歉,我是指“StackExchange” :) - Envin
1个回答

4
似乎你正在寻找事务性行为,尤其是原子性(“全部或无”)。但通常,“事务”意味着特定的保证(尤其是关于ACID属性),在涉及几分钟的人类时间范围内实现这些保证将很困难或不可能实现。
也许这里更适合使用“带有错误补偿的工作流”。
我建议手动实现此操作,或者通过工具支持(例如工作流引擎)来实现。开启一个进程来生成你的网络,并跟踪当前进度,例如创建的VM,正在进行中的VM等。如果出现需要回滚的错误,则另外开启一个处理过程执行清理工作。清理过程本身的行为可能会失败,因此可能需要多次重试其各个步骤,直到生成报告表明“此清理步骤失败”。
如果涉及共享资源,则还需要实现某种隔离机制。有时这很容易完成--例如,DHCP可帮助您避免重复的IP地址。如果正在更新DNS区文件,则需要同步访问以避免并发写入。等等。

我想我同意你的看法,Willie Wheeler。 - hfontanez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接