如果不能使用事务,如何在企业环境中有效地使用Web服务?

时间:2012-02-14 00:11:29

标签: web-services service soa

我正在努力建立一些基本规则,我们现在正在讨论的是本地库与用于代码重用的Web服务。 Web服务似乎是大多数公司的热门选择,而这正是大多数开发人员所倾向的。

我无法看到如何有效地使用Web服务进行任何认真的工作。如果我不能使用交易,如何安全地执行多个服务调用?

假设我有一个cron工作,它从我们的数据库中抓取客户,这些客户满足他们需要通知的特定条件。他们会收到传真,电子邮件和故障单,以便在内部跟踪问题。这是在for循环中为每个客户发生的3种不同的服务调用。

如果在那里的任何地方发生错误,例如,可能会向客户发送传真和电子邮件,但不会创建故障单。或者更糟糕的是,这个cron作业可能包含一个错误,导致它每次都在同一点失败,并且它反复向同一个客户发送电子邮件。如果这些库都是本地的,那么一切都可以包装在一个事务中,而这些都不会发生。但是我们在这个例子中使用了Web服务。

请注意,电子邮件和传真方法实际上将数据插入到电子邮件队列和传真队列中,而后者又通过cron作业处理。因此,对“发送电子邮件”和“发送传真”服务方法的调用可以安全地回滚。

一个选项是将整个代码块放在Web服务本身中,因此Web服务本身将在事务中调用电子邮件,传真和票证创建方法。但是,我们正在创建一个仅用于交易的Web服务方法;没有正当理由我们实际上需要从除一个cron脚本之外的任何地方调用此方法。

您通常如何处理此方法?

1 个答案:

答案 0 :(得分:1)

我会通过构建SAGA来处理它,这是一个长期运行的业务流程的抽象,它具有内部状态,响应外部事件,并与外部系统交互。

我会这样做是因为您的问题陈述不完整:当您因服务器关闭而无法发送电子邮件时会发生什么?如果传真系统不工作但其他两个不工作怎么办?

当你不能援引一个时,你应该重试吗?多长时间?如果你不能提高票价四小时,如果你升级给某人,会发生什么?如果这得到响应,那么需要跟踪票证状态并在一段时间后升级?如果您无法执行任何通知操作,是否应该通过电子邮件向原始提交者发送电子邮件?

使用saga是一个模型,当你不能只有一个事务时,因为它可能在操作完成之前可能会持续数小时的实时 - 并且持有一个很长的数据库锁,哎哟。

转向SOA意味着摆脱一些旧的假设。其中之一就是你应该编写方法并调用它们,将它们封装在更高级别的系统行为中,并将其作为服务公开。

如果您尝试构建类似于本地库的Web服务,那么您的生活就会变得糟透了。从您希望拥有数据的服务以及与该数据相关的自己行为的视图中解决此问题,并将详细信息封装在其中。

(顺便说一下,我怀疑从cron发送这些东西实际上是一个更大的业务流程的一部分,对,cron做的事情,并发送通知作为结果。你的服务可能很想揭露整个序列作为传奇而已。)

无论如何,重点是:你没有将事物封装在服务中,因为你想要一个事务,并且你不会把事情放在事务中只是为了使它们成为原子。这些是单独的问题,应该单独处理。

PS:如果您使用交易,如果发送的电子邮件但未创建票证,请不要发送两次电子邮件吗?无论如何,你实际上需要更精细的更新。