【发布时间】:2019-08-05 14:55:54
【问题描述】:
我有一个实时程序,它使网络调用服务 A 以执行有状态操作,并通过网络调用服务 B 以记录该操作的历史记录。转折是:
- 如果 B 失败,我们必须恢复操作 A(出于“原因”,我们需要完整的历史记录,否则操作根本不会发生)。换句话说,除非我们已经明确且成功地调用了服务来执行操作,否则我们无法编写审计跟踪(即,我们不能更改先调用审计跟踪,然后调用服务的顺序)。
- 在 B 中存在我们无法拥有的无效历史排序(这是 A 的有状态方面)
我有一些想法,没有一个是理想的:
- 在采取行动之前获取A的状态(这是一个可用的方法),如果对B的调用失败,我们可以再次以原始状态再次调用第一个服务。方法的问题是对 A 的“恢复”调用也可能失败。
- 在较高级别上,这似乎可以通过服务级别的“事务”来解决(其中两个服务调用都成功或都失败)。主要算法似乎是2-phase commit,但它似乎不是我们可以使用的,因为我们不拥有我们正在调用的服务,因此无法保证稳定的存储,我们无法为其添加功能“同意”与“事务协调员”
- 在我们这边实施我们自己的最大努力模拟交易。在我看来,这是一种相当复杂的方法,很难或不可能做到正确
- 有能力进入“最终一致的状态”。但是,根据 2,某些排序是不可能的,因此我们必须等待所有排队的操作完成才能继续。这将使我们的服务可能不再是实时的
有没有什么解决方案可以让日志的完整镜像100%正确满足要求?
【问题讨论】:
标签: transactions atomic distributed-computing soa distributed