2012-11-21 28 views
2

后,如果这一直是我的歉意问过了,这是.NET 2.0 ASMX Web服务,再次我向你道歉= d单独的线程它完成

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

我有一个SLA,所有消息都在X Seconds下处理。

过程中的一个函数Linking Methods现在需要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可能会决定在完成处理之前回收/终止这些线程。我同意我们的解决方案可能不是“最好的”,但我们没有时间在队列系统或其他Windows服务中构建来处理此问题。

有没有更好的方法来做到这一点?任何应该考虑的警告?

谢谢。

+0

你只需要计算响应时间? – pylover

+0

与响应时间无关。我需要在Web服务中调用一个长时间运行(10-20秒)的进程,并且我不希望在Web服务完成后停止该进程 –

+0

我认为你只需要做唯一的解决方案。 – pylover

回答

3

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

使用MSMQ with WCF:与MSMQ端点是IIS hosted(不需要只要使用Windows服务因为是已启用)从您的ASMX服务中,并拨打电话到服务创建一个WCF服务。您可以享受可靠排队的所有好处,而无需自行构建。

另外,如果您的MSMQ服务失败或引发异常,它将自动重新处理。如果您使用DTC并正在打一个数据库,则甚至可以将MSMQ事务流传送到数据库。

+0

添加一个队列是我看过的一个选项。它的风险较低,并给予我们更好的任务管理和更好的管理能力。感谢输入 –

+0

+1记住我MSMQ – pylover