2009-02-16 36 views
3

我们正在开发一个.NET应用程序,它必须使成千上万的小型Web服务调用到第三方Web服务。我们更喜欢更“矮胖”的电话,但第三方不支持它。我们设计客户端使用可配置数量的工作线程,并通过测试获得针对一个多核计算机进行了相当优化的代码。但是,我们仍然希望提高速度,并且正在研究跨多台机器的工作。我们非常精通典型的客户端/服务器/数据库应用程序,但是对于多台机器的设计来说是新的。所以,有几个相关的问题:向多台机器扩展工作的最佳方式是什么?

  • 是否有任何其他客户端优化,除了多线程,我们应该看看可以提高HTTP请求/响应速度? (我应该注意到这是一个非标准的Web服务,所以使用WebClient实现,而不是WCF或SOAP客户端)
  • 我们当前的想法是使用WCF将工作块发布到MSMQ,并在一个或多个机器将工作从队列中拉出。我们有WCF + MSMQ的经验,但要确保我们不会错过更好的选择。今天还有其他更好的方法吗?
  • 我见过一些像DigiPede和微软的HPC产品的第三方工具,但这些看起来像是矫枉过正。这些产品的任何经验或原因,我们应该考虑他们在我们自己的?
+0

尝试ActiveMQ而不是MSMQ,喜欢它。 – Avram 2009-02-16 18:38:36

+0

根据应用程序的不同,如果您已经在使用SQL Server,那么SQL Server Service Broker而不是MSMQ可能是一个重大胜利。 – MichaelGG 2009-02-16 18:56:17

回答

3

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

一定要看看你的client-side connection limits。默认情况下,我认为系统默认是2个连接。我没有尝试过这个,但通过使用这个属性来增加连接的数量,理论上你可以看到一个乘数效应,通过从一台机器产生更多的连接来产生更多的请求。 MS论坛上有more info

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

你有一个很好的起点。让它运行起来,然后转向性能和吞吐量。

+0

希望我可以标出所有答案 - 都非常有帮助,但是这个让我在我的app.config中设置了maxConnections,这导致了速度的两倍提高。仍然不是我们想要的地方,所以我们正在研究MSMQ,Rhino和EC2/Azure。 – Daniel 2009-02-17 15:32:46

1

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

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

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

我已经做了一些类似的W /多台电脑本地 - 管理工作量的基础是相似的Faler的做法。

1

如果你已经优化的代码,你可以看看优化网络侧,以尽量减少发送的数据包数量:

  • 重用HTTP会话(即:多个事务组合成一个会议通过保持连接打开,降低TCP开销)
  • 减少HTTP标头数到最低的要求,以节省带宽
  • 如果服务器支持,使用gzip压缩的身体请求(需要平衡CPU使用率以进行压缩以及节省的带宽)
相关问题