日期:2014-05-18  浏览次数:20781 次

[讨论]Web方式下服务器消息的实时读取
说老实话,这也不是什么新鲜的事物,只是当自己要来实现的时候总会有一些顾虑,所以拿出来先和各位高手切磋切磋。

在Web上抓取服务器消息的通常做法是用Ajax或隐藏帧定期到服务器上取消息,但过于频繁的刷新会增加服务器的资源消耗,为了尽可能减小这种消耗,通常我们都会把刷新的时间间隔设置得比较大。但这样一来,消息的获取就有一定的滞后,在对消息要求很实时的情况下,这显然是不合适的。比如我们在使用微博的时候会有一种体会,当有人@你或给你回复的时候,我们可以立刻收到通知,甚至在进行私信的聊天的时候,还能知道对方正在输入消息。

我目前在考虑一个系统的架构,这个系统采用B/S+C/S的混合模式,而消息在这个系统中不仅仅是给用户传递信息,更重要的是它还起到了协调客户端工作的功能,因此,对消息的实时性要求很高。有些人可能会说可以采用Socket的办法让客户端直接连接服务器,但我不打算这样做,原因很简单,因为浏览器不能直接使用Socket(至少目前还不能),如果用两个体制的话会把系统弄得太复杂。

我现在的思路是这样的,仍旧采用客户端(或浏览器)刷新服务器获取消息的办法,但为了达到实时性的要求,以及减少服务器因为开启TCP连接消耗的目的,获取消息的请求采用一个较长时间的HTTP连接。具体做法是这样:客户端先发送一个异步的HTTP请求,服务器检查有没有新消息,如果有就直接返回,如果没有就等30秒,期间不断检查有没有消息,有就立刻返回。客户端收到消息后进行处理,同时在5秒后重新发起消息请求。流程图如下:


由于在读取消息的时候会保持了一个较长时间的HTTP连接,虽然可以减少服务器开启TCP的消耗,但可能会同时有数十个TCP连接保持在服务器上(服务器操作系统Windows Server 2003 Standard,在线人数大约为50-60)。

所以,在这里发个帖请大家讨论一下这个方案的可行性,或者你有更好的解决办法,请不吝赐教,谢谢!

------解决方案--------------------
图画的很清晰,不错啊。。。。。。。

可以适当再延长Http的连接时间,许会效果会更好。
------解决方案--------------------
为什么不直接用socket?
------解决方案--------------------
WebSocket不行?