[讨论]Web方式下服务器消息的实时读取

effun 2012-07-13 10:02:28
说老实话,这也不是什么新鲜的事物,只是当自己要来实现的时候总会有一些顾虑,所以拿出来先和各位高手切磋切磋。

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

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

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


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

所以,在这里发个帖请大家讨论一下这个方案的可行性,或者你有更好的解决办法,请不吝赐教,谢谢!
...全文
211 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
effun 2012-07-26
  • 打赏
  • 举报
回复
看起来SignalR是一个不错的选择,好吧,结帖了。
effun 2012-07-16
  • 打赏
  • 举报
回复
别沉啊,跪求高手们都来帮忙出出主意。
effun 2012-07-14
  • 打赏
  • 举报
回复
我把流程想得这么复杂,是因为无论客户端还是浏览器,它们都必须在服务器的统一协调下进行工作,消息的内容并不是一个用户和另外一个用户说的话,而是一些控制信息,类似于Windows的消息。所以,每条消息必须要先送到服务器,再由服务器决定送到哪个客户端。

另外说到Socket,被你火眼识破,我还真对它不了解,只是玩过几次,没有真正用在工作上过,这也是我没有选择Socket的一个很重要因素。不过抛开客户端和Socket,如果这是一个纯B/S的系统,要实现这样的实时性要求比较高的消息读取,有没有更好的方案?
  • 打赏
  • 举报
回复
使用服务器长连接时,例如一个用户想更另外一个用户说话,那么系统直接就把消息发给另一个用户了,用不着你的图上(右边)那中每一个用户去去悲剧地轮询什么,这当然就真正地解放了服务器,服务器器不会轻易死翘翘啦。

甚至,例如silverlight,它就支持局域网内组播,那么服务器顶多只是用于帮助用户登录,而局域网那个内用户之间的大量通讯可以根本不走服务器中转。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
因为系统是一个混合模式的架构,如果再用Socket的话,.....,用Socket和用HTTP长连接的情形差不多,但编程的复杂性也会大一点。
[/Quote]

那是因为你不懂socket,从而把简单的socket硬套上什么http长连接。看来你在socket编程时也没有设计过长连接程序,只知道短连接。

在socket长连接操作时,不是什么客户端用一个命令就去拖死服务器死循环地去轮询什么,你的图像的整个右边的东西全都没有,使用socke长连接当然比你的图示简单好几倍。
effun 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

你的服务器端死翘翘,内耗将是非常壮观滴。
[/Quote]

问题出在哪里?
  • 打赏
  • 举报
回复
你的服务器端死翘翘,内耗将是非常壮观滴。
nonocast 2012-07-14
  • 打赏
  • 举报
回复
我个人认为只要把领导忽悠住了,换个IE不是难事
其实从根本上说信息化能力落后,都不能正确实施Window AD,否则根本没有这个麻烦
effun 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

为什么不直接用socket?
[/Quote]

因为系统是一个混合模式的架构,如果再用Socket的话,会很复杂。而且,用Socket和用HTTP长连接的情形差不多,但编程的复杂性也会大一点。
  • 打赏
  • 举报
回复
为什么不直接用socket?
effun 2012-07-13
  • 打赏
  • 举报
回复
图上有两个错字,懒得改了,呵呵。

HTTP连接时间多长比较合适呢?
isjoe 2012-07-13
  • 打赏
  • 举报
回复
图画的很清晰,不错啊。。。。。。。

可以适当再延长Http的连接时间,许会效果会更好。
effun 2012-07-13
  • 打赏
  • 举报
回复
就知道有人会说WebSocket,要知道我们面向用户的基本上还是XP+IE6,唉,我也不想的。
nonocast 2012-07-13
  • 打赏
  • 举报
回复
WebSocket不行?

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧