从asp.net(mvc)处理数千个外部服务调用的正确方法

时间:2010-02-01 23:08:08

标签: c# asp.net-mvc multithreading

我的任务是创建一个Web应用程序。我目前正在使用c#& asp.net(mvc - 但我怀疑它与这个问题有关) - 我是一个新手开发者,对.net来说有点新鲜。

应用程序构建中的部分逻辑是通过使用请求命中特定URL来向外部smsgateway发出请求 - 作为webapp中用户启动的操作的一部分(可能是几条消息)发送)或作为每日计划任务运行的一部分(可能会发送几千条消息)。

关于日常任务,我担心在一个线程中循环 - 比如 - 10.000次(特别是如果我也根据请求的响应采取行动 - 比如写入数据库)不是最好的策略并且我可以从某些并行化中获得一些性能/节省时间。

最终,我更担心成千上万的用户(很可能)会执行触发请求的操作。有一个天真的实现,为每个请求产生某种后台线程(无论它叫什么),我担心一次有数百/数千个请求的场景。

因此,如果我的假设是正确的 - 我该如何处理?我是否必须手动生成一些适当数量的新Thread()并从生产者/类似消费者的队列中协调他们的工作,还是有一些简单的方法?

干杯

4 个答案:

答案 0 :(得分:3)

如果你必须向服务发出10,000个请求,那么这意味着该服务的API很贫乏 - 可能是基于CRUD的,设计为数据库而不是实际服务的瘦包装。

对精心设计的服务的单一“请求”应该传达执行单个“工作单元”所需的所有信息 - 换句话说,这10,000个请求很可能合并为一个请求,或者至少一小撮要求。如果请求进入远程服务器或者可能需要很长时间才能完成(在计算中2-3秒是非常长时间),这一点尤其重要。

如果您无法控制服务,如果您无法更改规范或API,那么我认为您会发现这很困难。一台机器一次无法处理10,000个传出连接;它会挣扎甚至几百。您可以尝试并行化这一点,但即使您将吞吐量提高了十倍,它仍然需要半个小时才能完成,这是您可能不希望在面向公众的网站上运行的任务(但是,也许你这样做,我不知道具体细节)。

也许您可以更加具体地了解环境,架构以及您正在尝试做什么?


响应您的更新(可能有数千名用户同时执行某项操作,要求您为每个用户发送一条或两条短信):

这听起来就像你应该使用Message Queuing的场景。实际上设置solution using WCF并不困难。使用消息队列的一些主要原因是:

  • 要发送大量邮件;
  • 发送应用程序无法同步发送或等待任何类型的响应;
  • 消息必须最终传递。

你的要求就像手套一样。由于您已经在Microsoft堆栈上,我肯定会推荐由MSMQ支持的异步WCF服务。

答案 1 :(得分:0)

如果您正在使用SOAP或其他类型的XML请求,那么在循环中处理请求级别可能没有问题。

我使用具有4-5K请求的SOAP服务器设置了类似的东西,没有问题......

答案 2 :(得分:0)

对Web服务的SOAP请求(假设.NET 2.0和更高版本)如下所示:

WebServiceProxyClient myclient = new WebServiceProxyClient();

myclient.SomeOperation(parameter1, parameter2);

myclient.Close();

我假设此代码将嵌入到您的业务逻辑中,您将作为用户启动操作的一部分触发,或作为计划任务的一部分。

您无需在代码中执行任何特殊操作即可应对大量用户。这实际上是你平台上的一个问题。

当你说10.000请求时,你的意思是什么?每秒10.000请求/分钟/小时,这是您每天的页面点击等?

答案 3 :(得分:0)

我还会考虑使用AsyncController,这样您的网站就不会很快变得完全无法使用。