来说说server-push吧

ZMAK_Chun 2010-03-10 04:38:36
来谈谈Server Push吧
我本人既没用过gmail也没哟用过gtalk,但是server push这个话题引起叻我狠大兴趣,特此新开一贴,想跟大家讨论讨论,顺便希望从大家的讨论中的出思路.
我们都知道,涉及到网络双方通讯的程序,必然会有一个server一个client。从谁是消息的发起者这个角度看,通讯模型分为server-push和client-pull两种。
server-push的好处是及时性好,所以大量被应用在要求及时性的软件上,比如IM、网游、IRC聊天等。而client-pull的好处是对服务器压力小,所有TCP/IP连接都是短暂的,服务规模大,所以大量被应用在大流量应用上,如WEB、Email。
本来呢,server-push和client-pull是井水不凡河水,两者共同生存于网络世界相安无事。突然有一天,有好事者试图将server-push概念引入WEB应用中,于是引发叻一系列的讨论。以下我们只讨论WEB。
在我的记忆力,最初的server-push应用是IE4.0的“频道”,这是典型的信息推送。后来被证明这个东西是失败的,具体失败原因似乎有狠多,不想多说,只说一点,那就是不太符合用户习惯。
在这之后,聊天室狠流行,于是狠多人都在研究怎么能让聊天室最快地做到消息刷新实时性。在这里,分为两派,一派是继续走client-pull概念,方法就是用一个iframe定时去刷服务器上的数据,只不过刷新的间隔狠短(1秒-5秒左右),靠服务器网络的快速响应达到接近实时。而另外一派,就是走 server-push概念,方法就是用户连上网后,连接不断,就好像你下载一个狠大的文件一样,永远都下载不完,服务器总有新东西冒出来。在这之后,这个方法被证明为是理论上可行的,也是我们能想到的在web上实现server-push的唯一方法。
用简单的c#代码模拟一下,大概就是这样:
default.aspx.cs

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected override void Render(HtmlTextWriter writer)
{
string str;
while (true)
{
str = "<script>window.parent.Change('" + DateTime.Now.ToLongTimeString() + "')</script>";
this.Context.Response.Write(str);
this.Context.Response.Flush();
System.Threading.Thread.Sleep(1000);
}
}
}

WebForm1.aspx

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Asp.net Server Push</title>
<script type="text/javascript">
function Change(str) {
window.document.getElementById("div1").innerHTML = str;
}
function onload() {
var ifrpush = new ActiveXObject("htmlfile");
ifrpush.open();
var ifrDiv = ifrpush.createElement("div"); //添加一个DIV
ifrpush.appendChild(ifrDiv);
ifrpush.parentWindow.Change = Change;
ifrDiv.innerHTML = "<iframe src='Default.aspx'></iframe>";
ifrpush.close(); //关闭
}
onload();
</script>
</head>

<body>
<form id="form1" runat="server">
<div>
<div style=" float:left">现在时间是:</div>
<div id="div1"></div>
</div>
</form>
</body>
</html>

有一个非常重要的问题,那就是如果用户狠多,每个人连上来都是一个长连接,服务器会吃不消。
对于中小规模的WEB而言,没什么大不了的。但是,我们做个比方,假设一台服务器,没有server-push这样的东西,它每秒钟能够接收5000个请求,那么10秒钟之内,就能接收50000个请求。在极端情况下,我们假设所有这些请求都来自不同的人,那么我们就可以大概地说,这台服务器能撑住5万个人去浏览页面,没什么大问题。但是如果是server-push,假如有3000个人在长连接上,基本上就没有余量给其它人叻。再加上WEB应用本身又要去不断地刷新后台数据,所以整个应用给人的表现就是非常吃服务器资源。
后来聊天室不火叻,server-push概念就慢慢被人们淡忘叻。可以说,不论是applet、ActiveX还是上面的那种不间断HTTP连接,都无法使服务器达到传统client-pull的那种服务规模。

直到现在,google的出现,或者具体点说,gtalk的出现,又将server-push这个概念拉回叻人们的视野中。我不知道是不是 google解决叻服务规模的问题,所以才敢大胆地在gtalk上应用server-push,或者是不是google实现叻某种用户与用户之间建立 P2P连接的方法,才能让gtalk的响应如此之快?
下面是本人的一个项目需求
一个拍卖场景.有剩余时间和当前价钱,每一次竞价,所有人所显示价格就会更新,剩下的时间就会增加10秒.
我的思路,通过长连接传递数据到服务器,然后...存在数据库(缓存)中.其他的所有客户去Get这些数据..这样感觉不是很好.希望大家讨论讨论 ~~server-push..并帮我指正思路.谢谢各位。~!预祝各位生活愉快~工作顺利

原帖http://www.javaeye.com/topic/19089
...全文
348 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangjunfeng2010 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 vrhero 的回复:]

server push其实就是一种被逼无奈变相的刷新技术...随着RIA的成熟server push死定了...
[/Quote]

server push和RIA有什么关系啊?RIA只是客户端技术而已。

难道有了RIA,就不需要与服务器交互了???

搞不懂!!!
sichuno 2010-03-30
  • 打赏
  • 举报
回复
~.net放弃吧用这个吧..你那个需求也不用~我们私聊~ - -~
ZMAK_Chun 2010-03-11
  • 打赏
  • 举报
回复
引用 7 楼 geass 的回复:
这个东东在 JAVA(JSP) 上还好做,.NET就免了
....
应该可以实现吧..~昨天捣鼓了一个晚上 有点眉目..但是..
现在有几个问题..一台服务器最多可以接受几个长连接,,~~一个客户端保持几个长连接不会出现阻塞?
geass 2010-03-10
  • 打赏
  • 举报
回复
这个东东在 JAVA(JSP) 上还好做,.NET就免了
bychgh 2010-03-10
  • 打赏
  • 举报
回复
看看学习下~~~~~~~~~~~~~~
ZMAK_Chun 2010-03-10
  • 打赏
  • 举报
回复
引用 4 楼 kyoybs 的回复:
保持连接,不管是在资源占用上,还是开发效率上,稳定性上,都比较困难~

刚查了资料..说长连接一个客户端只能保持3个~?
kyoybs 2010-03-10
  • 打赏
  • 举报
回复
保持连接,不管是在资源占用上,还是开发效率上,稳定性上,都比较困难~
vrhero 2010-03-10
  • 打赏
  • 举报
回复
server push其实就是一种被逼无奈变相的刷新技术...随着RIA的成熟server push死定了...
ZMAK_Chun 2010-03-10
  • 打赏
  • 举报
回复
引用 1 楼 kyoybs 的回复:
web上server-push???? 看不懂~~~

算是模拟吧- -跟c/s上的感觉有差别~
kyoybs 2010-03-10
  • 打赏
  • 举报
回复
web上server-push???? 看不懂~~~

62,072

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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