两个SOAP服务的首选设计作为一个“事务”

时间:2013-06-01 11:58:19

标签: java soap transactions distributed-computing

我正在设计一种依赖于两个甚至三个SOAP服务进行更新的服务。例如,流程可以是这样的:

  1. 我的SOAP客户端在系统A中调用customerUpdate
  2. 我的SOAP客户端在系统B中调用customerUpdate
  3. 对于大多数情况,这种方法可行,系统将非常稳定(99%正常运行时间是目标),但总会有1%。如何使其接近交易。

    我一直在寻找一些类似设计的文献或某些经验,但到目前为止没有成功。

    问题是,如果SOAP调用1没问题,我应该如何通知调用者我的服务,但是调用2 failes。

    到目前为止,我看到了以下解决方案:

    • 我发出错误消息,告诉用户发生了什么:系统A已更新,但系统B未更新。他们必须重新发送以更新两个系统。
    • 我在失败时建立更新队列,并给出一个SOAP响应,告诉用户系统B离线/无响应,但会更新,系统A会更新。

    有没有人偶然发现这种情况的测试设计模式?或者也许有经验的人可以指出我正确的方向,哪两个应该是首选?哪一个更容易维护?

    我确实意识到这可能会引发讨论而不是针对有针对性的问题,但我希望这没关系。

1 个答案:

答案 0 :(得分:2)

至于您的第一个解决方案,这可能不适用。 例如,如果您有withdrawdeposit,并且deposit失败,则不得重复第一个操作。 无论如何,它让你的来电者做得正确。

至于您的第二个解决方案,所有服务必须记录失败的操作。除了呼叫者留在“在交易中间迷失”状态。

一般方法是让transaction控制两个操作。见here 对于某些WS-Transaction实现。

如果你不能拥有SOAP事务,我只提供一个 SOAP函数,它代表服务器端的调用者对所有受影响的系统进行事务处理,例如使用XA数据源。如果你看看你的例子,它可能是 无论如何,一个逻辑操作。

更新

如果您选择第一个解决方案,请考虑为每个SOAP消息添加唯一的自制事务ID。这应该为服务器端提供丢弃重复消息的一般方法(例如,通过实现事务日志)。