2

如果在我道歉之前有人问过这个问题,这是 .NET 2.0 ASMX Web 服务,我再次道歉 =D

仅公开 Web 服务的 .NET 应用程序。每天大约 1000 万条消息在多个 IIS 服务器之间进行负载平衡。每个传入消息都是 XML,而传出消息是 XML。(XMLElement)(我们有强大的服务器运行在类固醇上)。

我有一个 SLA,所有消息都在 X 秒内处理。

一个函数,链接方法,在这个过程中现在需要 10-20 秒,每个事务都需要它,但是在 Web 服务返回结果之前发生并不重要。正因为如此,我建议把它放到另一个线程上,但现在意识到我的话和他们背后热切的开发人员可能还没有完全考虑到这一点。

下面的示例在左侧显示了当前流程。在右侧正在尝试的内容

实际上,我正在寻找的是让 Web 服务产生一个长时间运行(10-20 秒)的线程,即使在 Web 服务完成后也会执行该线程。

我正在寻找的示例

这实际上是正在发生的事情:

        Thread linkThread= new Thread(delegate()
        {
            Linkmembers(GetContext(), ID1, ID2, SomeOtherThing, XMLOrSomething);
        });
        linkThread.Start();

使用它,我们将开发盒上的时间从 19 秒减少到 2.1 秒,这是相当可观的。

我担心随着我们获得的流量,如果供应商/外部方决定限制我们,IIS 可能会决定在它们完成处理之前回收/杀死这些线程。我同意我们的解决方案可能不是“最好的”,但是我们没有时间构建队列系统或其他 Windows 服务来处理这个问题。

有一个更好的方法吗?应考虑的任何警告?

谢谢。

4

1 回答 1

3

除了你描述的问题,我想不出任何问题。话虽如此,有一些方法可以解决问题,而无需从头开始构建自己的解决方案。

MSMQ 与 WCF 一起使用:使用IIS 托管的 MSMQ 端点创建 WCF 服务(只要启用了 WAS,就无需使用 Windows 服务),并从您的 ASMX 服务中调用该服务。您无需自己构建即可获得可靠队列的所有好处。

另外,如果您的 MSMQ 服务失败或抛出异常,它会自动重新处理。如果您使用 DTC 并访问数据库,您甚至可以让 MSMQ 事务流​​到数据库。

于 2012-11-21T03:04:42.170 回答