这是我的情景,现在它给我们带来了相当大的悲痛:
我们有供应商网络服务,提供基本级别的电话功能。该服务具有SOAP api,我们正在利用它来构建集成到我们内部Web应用程序中的自定义UI。 api在2个级别上运行。您对服务进行标准客户端调用以启动操作,例如登录,放置呼叫,挂断等。在另一个线程上,服务将事件发送回客户端以警告用户系统上发生的事情(代理成功登录,呼叫断开等)。
我实现了一个WCF服务,位于Web服务器和供应商服务之间。此WCF服务以双工模式运行,与Web服务器建立双向连接。 Web服务器对WCF服务进行出站调用,该服务将它们路由到供应商的Web服务。事件被接收回WCF服务,WCF服务通过WCF客户端上的回调通道将它们传递到Web服务器。当Web服务器上收到事件时,它们将被放入一个哈希表中,其中用户的名称作为键,.NET队列作为保存事件的值。每个事件都会排队到拥有它的代理商。
在2秒的时间间隔内,网页通过ajax请求轮询Web服务器,以获取登录用户的新事件。它命中用户密钥的哈希表,使任何存在的事件出列,并将它们序列化回网页。从那里开始按顺序处理它们,并向用户显示适当的消息。
此实现在单个用户方案中表现良好。第二个我在系统上放了超过1个用户,我开始频繁超时,发生以下CommunicationException:
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
我们正在运行Windows Server 2008 R2两台服务器。 Web应用程序和WCF服务都在.NET 3.5上运行。 WCF服务在双工模式下的net.tcp协议下运行。 Web应用程序是ASP.NET MVC 2.
有没有人处理过这种情况?是否有更有效的方式(或广泛接受的模式)来实现这一点?
编辑:有一件事我忘了提及 - 我的想法是增加的流量(增加额外的用户)只有一个专用的回调通道导致锁定,然后触发超时。在任何5秒的时间间隔内,服务最多可以连续10次回调。