将工作扩展到多台机器的最佳方法是什么?

时间:2009-02-16 18:06:38

标签: c# performance scaling

我们正在开发一个.NET应用程序,它必须为第三方Web服务提供数万个小型Web服务调用。我们宁愿选择更“粗俗”的电话,但第三方不支持。我们已经设计了客户端以使用可配置数量的工作线程,并且通过测试具有针对一个多核机器进行了相当优化的代码。但是,我们仍然希望提高速度,并且正在考虑在多台机器上分散工作。我们精通典型的客户端/服务器/数据库应用程序,但对于多台机器的设计却是新手。所以,有几个与此相关的问题:

  • 除了多线程之外,是否还有其他客户端优化,我们应该考虑哪些可以提高http请求/响应的速度? (我应该注意这是一个非标准的Web服务,所以使用WebClient实现,而不是WCF或SOAP客户端)
  • 我们当前的想法是使用WCF将工作块发布到MSMQ,并在一台或多台计算机上运行客户端以从队列中取出工作。我们有WCF + MSMQ的经验,但我们确信我们不会错过更好的选择。今天还有其他更好的方法吗?
  • 我见过一些第三方工具,比如DigiPede和微软的HPC产品,但这些似乎有些过分。我们应该考虑使用这些产品或原因的经验吗?

4 个答案:

答案 0 :(得分:3)

听起来您的目标是尽快执行所有这些Web服务调用,并将结果制成表格。鉴于此,您最大的效率控制将通过扩展您可以进行的并发请求的数量来实现。

请务必查看client-side connection limits。默认情况下,我认为系统默认为2个连接。我自己没有尝试过,但通过增加与此属性的连接数,理论上应该通过从单个机器生成更多连接来生成更多请求的乘数效应。在MS论坛上有more info

MSMQ选项效果很好。我自己正在运行该配置。 ActiveMQ也是一个很好的解决方案,但MSMQ已经在服务器上了。

你有一个很好的起点。将其付诸实践,然后继续提高性能和吞吐量。

答案 1 :(得分:1)

今年在CodeMash,Wesley Faler就这类问题做了一个有趣的演讲。他的解决方案是将“作业”存储在数据库中,然后使用客户端来完成工作并在完成时标记状态。

然后,他将整个基础设施推到了亚马逊的EC2。

Here's his slides from the presentation - 他们应该给你基本的想法:

我在本地做过类似的多个PC - 管理工作量的基础知识与Faler的方法类似。

答案 2 :(得分:1)

如果您已经优化了代码,您可以考虑优化网络端以最小化发送的数据包数量:

  • 重用HTTP会话(即:通过保持连接打开,将多个事务放入一个会话,减少TCP开销)
  • 在节省带宽的请求中将HTTP标头数量减少到最小值
  • 如果服务器支持,请使用gzip压缩请求的主体(需要平衡CPU使用率以进行压缩,以及节省的带宽)

答案 3 :(得分:0)

您可能需要考虑Rhino Service Bus而不是MSMQ。来源可用here