开发分布式WebIm--1(设想)

      开发一个手机IM系统的想法有很久了,最先我定位于基于xmpp协议的实现方式,为此我安装了Openfire和spark,搭建了一套完善的系统用于研究,spark的debug模式对我分析xmpp协议起到了重要的作用,随后我又安装了agsxmpp sdk,在一番折腾下我终于完成了agsxmpp示例客户端与spark客户端的通讯(Openfire有些地方不是100%实现了xmpp协议)。有兴趣的朋友可以看我《agsxmpp与Openfire联通》这篇文章。后来我又用过ejabberd作为服务器,ejabberd挺好的,没怎么摆弄就能顺利的和我的客户端相连。但下面这些问题始终无法解决,让我退却了,

1.基于xmpp协议的服务器都不提供用户花名册的功能,用其变通方式的花名册功能效率太低。

2.Erlang语言我研究了两天好不容易看懂了一个遍历程序,再往下看我就失去了兴趣。

3.手机上只能基于电信的CDMA连接,联通的GPRS只能用IP方式连接,移动就干脆无法连接。

于是自主开发一个基于分布式的WebIm就缓缓的萌发于我的脑海中。

    随后我在网上查阅了大量的资料,随着一个问题又一个问题的提出与解决,一张又一张的流程图做出来。我脑海中的方案逐渐清晰,这里我把一些心得写一下,希望和朋友们分享。

1.Comet

  Comet是一种服务器推技术,我看了很多的介绍,大把大把的框架和协议基本把我绕晕了,我打过一阵退堂鼓,但是Comet最大的优势是节约带宽,设想一下ajax技术轮询服务器:3s一次连接,用基于Utf-8的编码来发送一个HTTP头加内容估计是200byte,8个小时的流量是:200*20*60*8=1,920,000byte,一个月就是60M,太恐怖了,这样的软件肯定没人用了。不得已逼得我继续研究Comet,后来我发现Comet就是服务器端hold一段时间,保持和客户端的连接而已,一句sleep就搞定了。当然Comet是一个整体的浏览器解决方案,而我只是借用其中的HTTP用于通信,这点还是不同的。

2.IIS最大连接数

  用sleep把线程hold住以后,我就关心IIS最多能支持多少个并发线程,这个太重要了,如果IIS只能同时并发几十个线程,那么这个方案也是没有意义的。网上找不到答案,用IIS最大连接数作为关键词搜索,只能得到卖虚拟主机的商家。于是我自己测试,把WAS打开一测,IIS只能同时连接36个线程,我顿时心凉了半截!郁闷了一天,到处找资料都没法解决,后来突然发现我系统是XP的(装xp是因为我开发蓝牙程序,只有xp的驱动),xp连接数是受限的。换到2003后马上跑出了3966个连接(一个WAS最大同时连接数了)。但还有个问题,虽然性能计数器上显示的是3966个连接,但多数线程还是处于等待状态中,又怎么办呢?

3.Web园

  想要体会3967个连接同时运行吗?打开IIS-应用程序池-属性-性能-Web园,把默认的1改成100,马上运行WAS,性能计数器上显示的是3966个连接,再打开一个IE页面,数据缓缓的显示出来,IE进度条被hold住,说明服务器端没有释放连接,同时性能计数器上显示的是3967个连接,测试成功了!

 


for ( int  i = 0 ;i < 100 ;i ++ )
{
   Response.Write(i);
   System.Threading.Thread.Sleep(
3000 );

}

 

4.Remoting

使用Web园以后,Application变量和Static变量都无法使用了。观察任务管理器,你会发现出现了很多w3wp.exe程序,每个w3wp.exe进程对应一个Web园。Application变量和Static变量都无法跨进程存在,所以进程间的通讯只能使用数据库或者Remoting了.我选择使用Remoting是因为Remoting具备双向通信和事件通知功能,这样就大大节约了系统资源。设想4000个用户在线1秒去Select一次数据库查看自己的消息,那就需要数据库0.25ms内处理完这个select。我还没有接触过这种服务器,你有用过吗?发出来眼馋一下吧。

      

你可能感兴趣的:(WebI)