我希望有人能启发一些想法或提供参考资料,以便在PHP5中创建“事务协调器”实现。该驱动程序基于多供应商单一业务流程集成。由于潜在的故障点,我希望避免大量的if、switches、try..catches代码,并拥有一个协调器,该协调器可以拦截方法调用,跟踪对后续调用的响应,并询问方法属性以确定使用什么补偿函数来逆转事务。这样做的目的是创建一个类似于处理的“酸”。最后,我可以引用的是.Net中的TransactionScope对象。
示例场景:
ServiceA
ServiceB
ServiceC
ServiceA->DoSomething() - passes
ServiceB->DoSomething() - passes
ServiceC->DoSomething() - fails在这一点上,A&B必须采用某种类型的补偿策略来调用功能,该功能将返回状态,无论是数据库、第三方集成还是返回到其原始状态。
我最初的想法是使用某种类型的AOP来保存对补偿器和状态需求的引用,以完成逆转活动。则协调器将需要跟踪执行以及返回的执行状态以允许对补偿器的调用。
发布于 2012-10-12 02:53:22
不要尝试酸,因为你不能这样做。试图伪造它会在某个时候泄露信息,所以最好从一开始就不要尝试。正如您自己所写的,使用服务A执行一个步骤,然后看到服务C失败,您需要告诉服务A撤消所采取的一个步骤。如果无法撤消单个步骤,解决方法可能是使用服务A重新开始,执行重置和所有以前完成的步骤,而不是事务中的最后一个步骤。这听起来一点也不酸。假装它是会在某个时候失败的。
在对流程建模时,请对其使用有限状态机。它独立于您的服务能做什么或不能做什么,但您可以跟踪需要采取哪些步骤,可能是按什么顺序,如果某个步骤失败了要做什么,并且在任何时候都可以相对容易地进行扩展。
关于你的评论,你可能会在if,switch和try/catch的混乱中结束:这完全取决于你,但与实现一个过程无关。
如果您正在寻找状态机的实现,那么针对PHP的实现并不多。PEAR有一个非常PHP4风格的老版本,它可能仍然可以工作并完成工作(看看:http://pear.php.net/package/FSM ),但更好的实现将是https://github.com/Metabor/Statemachine -这个家伙已经编写了所有的“状态机”,我在那里看到了一些非常好的特性,例如通过回调将完成工作的代码移交给转换,然后通过事件更改转换。这样做的好处是状态机完全控制可以和不能做什么,如果可以做,它将通过回调来完成。
一个不错的特性是,您可以将已定义的状态和转换作为图像进行掌握。
https://stackoverflow.com/questions/12846102
复制相似问题