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


14

我正在工作的地方正在尝试建立一些基本规则,而我们现在正在争论的是本地库与Web服务之间的代码重用。Web服务似乎是大多数公司中的热门选择,这就是大多数开发人员都倾向于的。

我只是看不到如何有效地将Web服务用于任何严肃的工作。如果无法使用事务,如何安全地执行多个服务调用?

假设我有一个Cron工作,它从我们的数据库中获取满足一定条件的客户,这些客户需要通知他们。将向他们发送传真,电子邮件并创建票证以在内部跟踪问题。在for循环中,每个客户将发生3个不同的服务调用。

如果那里的任何地方发生错误,则可能会例如将传真和电子邮件发送给客户,但不会创建故障单。或更糟糕的是,此Cron作业可能包含一个错误,导致每次都在同一时间失败,并反复向同一位客户发送电子邮件。如果所有库都是本地的,则所有内容都可以包装在事务中,而不会发生任何事情。但是在此示例中,我们使用的是Web服务。

请注意,电子邮件和传真方法实际上将数据插入到数据库支持的队列表中,而这些表又由单独的cron作业进程处理。因此,如果需要,可以免费中止对“发送电子邮件”和“发送传真”服务方法的调用。

一种选择是将整个代码块放在Web服务本身中,以便Web服务本身将在事务中调用电子邮件,传真和票证创建方法。但是随后我们创建了一个仅用于事务处理的Web服务方法。没有确凿的理由,我们实际上需要从该cron脚本之外的任何地方调用此方法。

您通常将如何处理此方法?


为了提供完整的答案,我需要更多信息。转向基于服务的体系结构时,有很多事情要考虑。例如,您是否具有异构(不同的语言和平台)或同质(单一的语言和平台)环境。您是否有服务总线系统?如果不是,您打算实施其中一项吗?您打算如何计划访问您的服务(单位置Intranet,多位置WAN,访问公共服务api的分布式客户端)。有许多变量会影响“最佳”解决方案。
迈克尔·布朗

@MikeBrown:这些服务全部以一种语言编写,但是被多个平台使用。完全不了解实施EBS的想法,我们甚至还没有开始任何类型的服务工作,因此一切皆有可能。这些服务大部分将在内部通过我们的本地网络使用,但是对于移动应用程序,某些服务将需要面向公众。
ryeguy 2012年

“如果所有库都是本地的,则所有内容都可以包装在事务中,而不会发生任何事情”。假。发送电子邮件之后但最终数据库更新之前,可能会发生该错误。交易不会追溯阻止电子邮件或传真。
S.Lott 2012年

@ S.Lott:那样,因为电子邮件和传真服务调用实际上只是将它们插入队列中,而队列是通过不同的过程传递的。如果发生上述事务,则队列插入将被中止。
ryeguy 2012年

1
@ryeguy:请更新问题。请不要在问题中添加评论。这是架构的重要组成部分。请在问题中予以披露。
S.Lott 2012年

Answers:



3

有趣的是,当我参与这个特殊的问答时,我正在参与的DDD / CQRS邮件列表中也有类似的线程支持多个平台的服务。我可以在这里重申我的一些建议。

在异构环境中支持事务的一种选择是使用一种传输机制,该机制支持事务并在使用该事务的所有平台上都受支持。该高级消息队列协议(AMQP)不支持交易和有几乎是目前被广泛使用的每一种语言的本地API。RabbitMQ是实现AMQP的服务器,在业界已作为可靠的解决方案进行了审查。

利用基于RabbitMQ的系统,您可以在需要成长为完整ESB的情况下走上一条道路。您将消息发布到频道并订阅队列。真正强大的地方在于通道和队列之间,您可以执行很多有趣的事情。一个通道可以提供多个队列(发布/订阅),一个队列可以由多个通道提供,您可以根据内容将消息路由到不同的队列等。

我只是在阅读有关事务的替代方法(这些方法带有开销,并将异步操作转变为阻塞操作)。RabbitMQ支持所谓的发布者确认。基本上,它允许您注册已发布方法的回调以处理失败的事务。对于您而言,它可以撤消电子邮件/传真请求并删除故障单。

当然,兔子洞(双关语)从那里甚至更深。您可以使用Rabbit来对内部和外部Web服务进行复杂的编排。

对于面向公众的Web服务,它变得非常简单。您的服务(无论是SOAP,REST还是JSON)都只是将消息发布到适当的服务队列,然后让您的内部系统从那里处理它。

还有一些功能可以为您希望快速返回信息的情况创建请求/响应消息。



1

我在编写的服务应用程序中处理此问题的方式是创建一个包装器以处理必要的交易。在我的情况下,由网站,桌面应用程序或Windows服务发出的用户请求必须查询一个Web服务,并且根据结果和用户的选择,它必须更新一个本地数据库,并且可以选择更新一个远程数据库。通过网络服务。然后,它必须生成报告以立即返回,通过电子邮件和/或传真发送。我可以控制本地数据库,电子邮件和报告的生成,但不能控制Web服务或传真服务器。

创建包装器可以实现更好的事务控制和错误处理。通过控制从外部来源对内部网络服务的访问,它还提供了更好的安全性。总的来说,我认为对交易和服务的需求是为单个解决方案创建适当的包装的有效理由,只要正确地重复使用代码即可(无需剪切粘贴)。


1

我只是看不到如何有效地将Web服务用于任何严肃的工作。如果无法使用事务,如何安全地执行多个服务调用?

你不能

您应该问的问题是:如何使用Web服务框架X实施事务?现在,您只是假设这是不可能的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.