0

我希望有人能激发一些想法或提供参考资料,以在 PHP 5 中创建“事务协调器”实现。驱动程序基于多供应商单一业务流程集成。由于潜在的故障点,我想避免带有大量 if、开关、try..catch 的意大利面条代码,并有一个可以拦截方法调用、跟踪对后续调用的响应并询问方法属性以确定补偿功能的协调器用于撤销交易。目的是创建类似“ACID”的处理。我可以参考的最后一个东西是 .Net 中的 TransactionScope 对象。

示例场景:

ServiceA
ServiceB
ServiceC

ServiceA->DoSomething() - passes
ServiceB->DoSomething() - passes
ServiceC->DoSomething() - fails

此时 A & B 必须采用某种类型的补偿策略来调用将返回状态的功能,无论是数据库、第三方集成还是以其他方式返回其原始状态。

我最初的想法是使用某种类型的 AOP 来保存对补偿器的引用和完成反转活动的状态要求。协调器需要跟踪执行以及返回的执行状态以允许调用补偿器。

4

1 回答 1

1

不要尝试 ACID,因为你做不到。试图伪造它会在某些时候泄漏,所以最好不要一开始就尝试。正如您自己编写的那样,使用服务 A 执行一步,后来看到服务 C 失败,您需要告诉服务 A 撤消已采取的一步。如果无法撤消单个步骤,则解决方法可能是使用服务 A 重新启动,执行重置和所有先前完成的步骤,而不是事务中的最后一个步骤。这听起来一点也不酸。假装它在某个时候会失败。

在为流程建模时,请为其使用有限状态机。它独立于您的服务能做什么或不能做什么,但您可以跟踪需要采取哪些步骤,可能按什么顺序执行,如果步骤失败该怎么办,并且在任何时候扩展都相对容易。

关于您的评论,您可能会陷入混乱的 if、switch 和 try/catch:这完全取决于您,但与实施流程无关。

如果您正在寻找状态机的实现,那么 PHP 没有那么多。PEAR 有一个非常 PHP4 风格的旧版本,它可能仍然可以工作并完成工作(看看: http: //pear.php.net/package/FSM),但更好的实现是https://github。 com/Metabor/Statemachine - 这家伙已经写了“状态机”,我看到了一些非常好的特性,例如通过回调将执行工作的代码移交给转换,然后通过事件更改转换。这样做的好处是您的状态机可以完全控制可以做什么和不可以做什么,如果可以完成,它将通过回调来完成。

一个简洁的功能是您可以将定义的状态和转换作为图像获取。

于 2012-10-11T18:53:21.793 回答