2011-07-28 50 views
2

我有一个相当直接的scatter-gather pattern实现使用IIS托管的Web服务(WCF)作为请求处理程序(广播)和聚合器。使用IIS托管的WCF服务实现“传奇超时”?

使用标准的NetMsmqBinding,单向消息协定和WAS,一切运行都很顺利。但是现在我们要引入一个业务规则,即聚合器只会等待一定的时间(可能几天)才能做出最终的响应;如果部分或全部未收到,则应关闭该批次并公布其拥有的任何信息。通常情况下,只有在所有端点都报告后才会发布。

我知道我可以在广播消息上设置消息到期时间,这样终端不会浪费时间做不必要的工作,但是触发早期发布呢?

NServiceBus将sagas视为第一级公民,优雅地处理超时,并且我知道BizTalk实际上是将整个分散收集作为一个单独的协调实现的。但我不想为这个需求部署任何新的工具或服务。

是否有一种方法来实现长时间运行的批处理超时操作只使用WCF和MSMQ?

(再 - 汇聚托管在IIS中,所以我不能只设置一个计时器;应用程序池可以在任何时候进行回收或关闭)

回答

0

你可以实现你自己的,但是您需要找到一种方法来管理每个请求实例的超时,管理每个实例的状态,同时等待每个供应商的响应,将响应关联起来,并且还将pub/sub体系结构引入依次将聚合器与供应商分离,以便您可以处理由他们发布的事件。

在我看来,这听起来像很多工作,并且正是NServiceBus开箱即用(以及更多)的类型。我会再看看它。企业总是在变化,传奇越来越普遍,我们意识到。这可能是现在的一个要求,但这可能很快会再次改变。

+0

这是...全部已经完成。这正是分散聚集的工作原理。聚合器和供应商之间没有耦合。我需要的只是暂停。它不需要是每个请求或每个实例的超时,只有一个用于整个批处理。我向你保证,我已经看过NServiceBus并尽可能使用它,但几天后我无法使用它完成整个系统的改造。 – Aaronaught

+0

够公平的。所以我假设聚合器需要知道何时发送批次以便调用超时并发布返回的结果。您能否向聚合器发送包含批处理详细信息的消息,并配置超时机制,然后在期限结束后发布?这样您可以为每批次设置不同的超时时间。问题是你用什么超时机制? – stephenl

+0

所有的请求信息已被跟踪。最难的部分是确保聚合器(或其他一些Web服务 - 只要它在同一个IIS应用程序中就可以),实际上在超时过期时被激活。这就是为什么我提到我使用IIS和WAS的几次。设置超时很容易,但如果应用程序池被回收或关闭,这并不会取得很大成功。 – Aaronaught