完成后,Web服务中的单独线程

时间:2012-11-21 00:45:51

标签: c# multithreading web-services .net-2.0 asmx

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

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

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

一个功能,即链接方法,在此过程中需要10-20秒,每个事务都需要它,但是在Web服务返回结果之前发生它并不重要。因此,我提出了将其抛弃到另一个线程的建议,但现在意识到我的话语和他们背后的热心开发人员可能还没有完全考虑过这一点。

以下示例左侧显示当前流量。在右边正在尝试什么

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

Example of what I'm looking for

这是有效的,正在发生的事情:

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

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

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

有更好的方法吗?有什么需要考虑的警告吗?

感谢。

1 个答案:

答案 0 :(得分:3)

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

使用MSMQ with WCF:使用IIS hosted的MSMQ端点创建WCF服务(只要启用了WAS,就不需要使用Windows服务)并从ASMX中调用服务服务。您可以获得可靠排队的所有好处,而无需构建自己的排队。

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