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

C# 处理来自asp.net(mvc)的数千个外部服务调用的正确方法,c#,asp.net-mvc,multithreading,C#,Asp.net Mvc,Multithreading,我的任务是创建一个web应用程序。我目前正在使用c#&asp.net(mvc——但我怀疑它与这个问题是否相关)——我是一名新手,对.net有些陌生 应用程序im构建中的部分逻辑是通过使用请求点击特定url的方式向外部smsgateway发出请求-作为用户在webapp中发起的操作的一部分(可能是发送几条消息)或作为每天运行的scheduledtask的一部分(可能是并且将是数千条消息发送) 对于一个日常任务,我担心在一个线程中循环10.000次(特别是如果im也要根据请求的响应采取行动,比如写入

我的任务是创建一个web应用程序。我目前正在使用c#&asp.net(mvc——但我怀疑它与这个问题是否相关)——我是一名新手,对.net有些陌生

应用程序im构建中的部分逻辑是通过使用请求点击特定url的方式向外部smsgateway发出请求-作为用户在webapp中发起的操作的一部分(可能是发送几条消息)或作为每天运行的scheduledtask的一部分(可能是并且将是数千条消息发送)

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

最终,我更担心数千名用户同时(很可能)执行触发请求的操作。对于为每个请求生成某种后台线程(不管它叫什么)的幼稚实现,我担心会出现一个同时有数百/数千个请求的场景

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


干杯

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


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

如果您必须向服务发出10000个请求,那么这意味着该服务的API很贫乏——可能是基于CRUD的,设计为数据库上的薄包装,而不是实际的服务

对设计良好的服务的单个“请求”应传达执行单个“工作单元”所需的所有信息——换句话说,这10000个请求很可能合并为一个请求,或者至少合并为一小部分请求。如果请求要发送到远程服务器,或者可能需要很长时间才能完成(在计算中,2-3秒是非常长的时间),这一点尤为重要

如果您无法控制服务,如果您无法更改规范或API,那么我认为您会发现这非常困难。一台机器根本无法同时处理10000个传出连接;它甚至会与几百人作斗争。您可以尝试并行化,但即使吞吐量增加了10倍,也需要半小时才能完成,这是您可能不希望在面向公众的网站上运行的任务(但是,也许您需要,我不知道具体细节)

也许您可以更具体地了解环境、体系结构,以及您正在尝试做什么


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

这听起来正是您应该使用的场景。事实上,建立一个新的团队并不难。使用消息队列的一些主要原因是:

  • 有大量的信息要发送
  • 发送应用程序无法同步发送或等待任何类型的响应
  • 这些信息最终必须被传递

你的要求就像手套一样适合这个。由于您已经在Microsoft stack上,我绝对推荐一个由MSMQ支持的异步WCF服务。

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

WebServiceProxyClient myclient = new WebServiceProxyClient();

myclient.SomeOperation(parameter1, parameter2);

myclient.Close();
我假设此代码将嵌入到您的业务逻辑中,您将作为用户发起的操作的一部分或计划任务的一部分被触发

你不需要在你的代码中做任何特别的,来应付大量的用户。这实际上是在您的平台上进行缩放的问题


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

我也会考虑使用,这样您的站点不会很快变得完全不可用

让问题更具体一点,我要研究msmq。同时,我会记下这个答案以感谢你的帮助