我正在设计一种依赖于两个甚至三个SOAP服务进行更新的服务。例如,流程可以是这样的:
对于大多数情况,这种方法可行,系统将非常稳定(99%正常运行时间是目标),但总会有1%。如何使其接近交易。
我一直在寻找一些类似设计的文献或某些经验,但到目前为止没有成功。
问题是,如果SOAP调用1没问题,我应该如何通知调用者我的服务,但是调用2 failes。
到目前为止,我看到了以下解决方案:
有没有人偶然发现这种情况的测试设计模式?或者也许有经验的人可以指出我正确的方向,哪两个应该是首选?哪一个更容易维护?
我确实意识到这可能会引发讨论而不是针对有针对性的问题,但我希望这没关系。
答案 0 :(得分:2)
至于您的第一个解决方案,这可能不适用。
例如,如果您有withdraw
和deposit
,并且deposit
失败,则不得重复第一个操作。
无论如何,它让你的来电者做得正确。
至于您的第二个解决方案,所有服务必须记录失败的操作。除了呼叫者留在“在交易中间迷失”状态。
一般方法是让transaction
控制两个操作。见here
对于某些WS-Transaction实现。
如果你不能拥有SOAP事务,我只提供一个 SOAP函数,它代表服务器端的调用者对所有受影响的系统进行事务处理,例如使用XA数据源。如果你看看你的例子,它可能是 无论如何,一个逻辑操作。
更新
如果您选择第一个解决方案,请考虑为每个SOAP消息添加唯一的自制事务ID。这应该为服务器端提供丢弃重复消息的一般方法(例如,通过实现事务日志)。