2

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

  1. 我的 SOAP 客户端在系统 A 中调用 customerUpdate
  2. 我的 SOAP 客户端在系统 B 中调用 customerUpdate

在大多数情况下,这可以正常工作,系统将非常稳定(目标是 99% 的正常运行时间),但总会有 1%。我怎样才能使这接近交易。

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

问题是如果 SOAP 调用 1 正常,但调用 2 失败,我应该如何通知调用者我的服务。

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

  • 我发出一条错误消息,告诉用户发生了什么:系统 A 已更新,但系统 B 没有。他们必须重新发送以更新两个系统。
  • 当更新失败时,我创建了一个更新队列,并给出一个 SOAP 响应,告诉用户系统 B 脱机/无响应但将被更新,系统 A 已更新。

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

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

4

1 回答 1

2

至于您的第一个解决方案,这可能并不普遍适用。例如,如果你有withdrawand deposit, anddeposit失败,你不能重复第一个操作。无论如何,它会让你的来电者做对。

至于您的第二种解决方案,所有服务都必须记录失败的操作。此外,调用者处于“在事务中丢失”状态。

一般的方法是transaction控制这两个操作。请参阅此处 了解一些 WS-Transaction 实现。

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

更新

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

于 2013-06-01T12:45:34.670 回答