【问题标题】:Implementing a "saga timeout" using an IIS-hosted WCF service?使用 IIS 托管的 WCF 服务实现“传奇超时”?
【发布时间】:2011-10-14 17:51:53
【问题描述】:

我有一个相当简单的 scatter-gather pattern 实现,它使用 IIS 托管的 Web 服务 (WCF) 作为请求处理程序(广播)和聚合器。

使用标准 NetMsmqBinding、单向消息合约和 WAS,一切都运行得非常顺利。但是现在我们想引入一个业务规则,聚合器只会等待一定的时间(可能是几天)来获得最终响应;如果部分或全部没有收到,它应该关闭该批次并发布它拥有的任何信息。通常它只会在所有端点都报告后才会启动发布。

我知道我可以对广播消息设置消息过期,这样端点就不会浪费时间做不必要的工作,但是触发提前发布呢?

NServiceBus 将sagas 视为一等公民,优雅地处理超时,而且我知道 BizTalk 实际上将整个分散-收集实现为单个编排。但我不想仅仅为了这一要求而部署任何新工具或服务。

有没有办法只使用 WCF 和 MSMQ 来实现长时间运行的批处理超时操作?

(再一次 - 聚合器托管在 IIS 中,所以我不能只设置一个计时器;应用程序池可以随时回收或关闭。)

【问题讨论】:

    标签: .net wcf msmq soa eai


    【解决方案1】:

    您可以实现自己的,但您需要找到一种方法来管理每个请求实例的超时,在每个实例等待每个供应商的响应时管理每个实例的状态,关联响应,并且还引入了一个发布/订阅架构来将聚合器与供应商分离,以便您可以处理他们发布的事件。

    在我看来,这听起来像是大量的工作,而这正是NServiceBus 提供的开箱即用的东西类型(还有更多)。我会再看看它。企业总是在变化,我们意识到传奇更常见。现在这可能是一项要求,但很快就会再次改变。

    【讨论】:

    • 这……一切都已经完成了。这正是 scatter-gather 的工作原理。聚合器和供应商之间没有耦合。我需要的只是超时。它不需要是每个请求或每个实例的超时,只需一个用于整个批次。我向你保证,我已经查看了 NServiceBus 并尽可能使用它,但我无法在几天内用它改造整个系统。
    • 很公平。所以我假设聚合器需要知道批处理的发送时间,以便调用超时并发布返回的结果。您能否不向聚合器发送包含批处理详细信息的消息并配置您的超时机制,然后在该期限过去后让它发布?这样您就可以为每个批次设置不同的超时时间。问题是你用什么来设置超时机制?
    • 所有请求信息都已被跟踪。困难的部分是确保聚合器(或其他一些 Web 服务 - 只要它位于同一个 IIS 应用程序中就可以了)在超时到期时实际上被激活。这就是为什么我多次提到我正在使用 IIS 和 WAS。设置超时很容易,但如果应用程序池被回收或关闭,这并没有多大作用。
    猜你喜欢
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多