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

如果在我道歉之前已经问过这个,这是.NET 2.0 ASMX Web服务,那么我的道歉= D

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

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

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

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

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

我正在寻找的例子

实际上,这是有效的:

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

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

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

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

谢谢。

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

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

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