推送与轮询

5
我有一个SL客户端和一个WCF服务。客户端每4秒轮询一次WCF,我同时有近100个客户端。
Web服务器是一台入门级服务器,配备512 MB RAM。
我想知道,如果轮询取决于服务器配置,那么如果我增加服务器配置,客户端的轮询是否会更好?
其次,推送(双工)是否比轮询更好?我从阅读的博客中得到了一些混合的回应。
此外,在优化轮询以获得更快响应的客户端方面,有什么最佳实践?我的应用程序需要实时数据。
谢谢。

你遇到了什么问题?WCF服务没有在合理的时间内响应吗?4秒(+响应时间)不够“实时”吗? - Matt Mills
问题-让我们来谈谈100个客户端。每个客户端以4秒的间隔进行轮询。现在,让我们取一个随机的"poll_no" - 客户端应该收到一些数据。我的一些客户端收到了它,而另一些则没有。下一次轮询,一些其他客户端会收到数据,而不同的一组则不会! - Jayesh
WCF服务是做什么的?它在计算上是否密集或者IO绑定(或者以其他方式长时间运行)?它是否调用数据库或执行某些外部处理?听起来你的服务内部存在问题,无论是负载过重还是出现故障;单独轮询并不是问题。如果您对该服务运行10个客户端,他们每次都会得到响应吗? - Matt Mills
WCF 提供计算服务,不进行数据库通信。WCF 将 XML 作为字符串发送给客户端。对于较少的客户端数量,其表现良好。 - Jayesh
2个回答

3
我的猜测是您遇到了某种竞态条件,这只会在更多客户端连接时才会出现。您的WCF服务使用哪些并发和实例化模式?(请参阅MSDN:WCF Sessions、Instancing和Concurrency,网址为http://msdn.microsoft.com/en-us/library/ms731193.aspx
如果您“丢失”响应,则首先要做的是开始记录或跟踪服务器上发生的情况。例如,当客户端“看不到”响应时,服务器是否收到了请求?(如果是这样,它会发生什么等等。)
我还会关注内存使用情况--您没有说您使用的是什么操作系统,但512 MB如今已经非常少了。如果您曾经陷入交换到磁盘的情况,那显然不是好事。
最后,假设您的服务是CPU绑定的(即没有重型数据库和文件系统调用),提高吞吐量的最佳方式可能是减少消息负载(线路尺寸),使用性能最佳的绑定(即如果客户端是.NET并且您控制它,则NetTcp绑定比HTTP快得多),当然,对您的服务进行多线程处理。在我看来,根据您提供的信息 - 其他所有事情都相等 - 轮询可能很好,而推送可能只会使事情更加复杂。如果这很重要,您真的希望采用真正的工程方法来解决问题,并确定/测量瓶颈。

希望这可以帮助您!


谢谢你的解释。我正在使用Windows操作系统。我的客户端是一个SL客户端,所以我怀疑我在绑定方面是否有任何灵活性。你认为增加RAM会带来更好的性能吗? - Jayesh
“Windows操作系统”可以缩小选择范围,大约只有十几个选择... ;-) 2000?2003?XP?Win 7?您需要查看任务管理器或性能计数器以查看正在使用多少内存。有很多资源可帮助您完成此操作。SilverLight是微软技术,因此在绑定方面可能会有选项——这取决于客户端开发团队如何解决WCF服务端点(生成的代理——更难更改绑定,或配置文件——更容易更改)。但您真正需要做的是先修复丢失的响应,然后找出瓶颈所在。 - Keith Bluestone
它是服务器'03。好的,我会检查任务管理器。具体来说,我能监视服务器上每个线程的性能吗? - Jayesh
有了像2003这样相对现代的操作系统,您可以测量进程的大多数方面。您是否已经确定了WCF服务的实例化和并发设置?这可能会影响性能以及改善性能的选项。 - Keith Bluestone
是的,我查看了您提供的链接中的内容。非常有帮助! - Jayesh

1
“推送”通知通常具有较低的网络开销,因为在没有通信内容时不会发送任何流量。但是,“拉取”通知通常具有较低的应用程序开销,因为当客户端处于空闲等待通知状态时,您无需维护状态。
“推送”通知也往往更“快”,因为事件发生后立即通知客户端,而不必等待下一个轮询间隔。但是,拉取通知更加灵活--您可以使用几乎任何服务器或协议,并且通过加倍轮询等待间隔,可以将客户端容量增加一倍。

我一直在思考这种事情。你知道有关于每种方法的优缺点讨论的链接吗? - Justin Morgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接