今天在学习的时候,想到一个问题,当终端设备很多的时候,如果每个终端都需要与服务器建立长连接的话,那不是会对服务器造成很大的压力,为此就咨询了下peter,然后也在网络上搜索了下这方面的知识,没想到见识到了一个东西,在此特别备注了下,便于后期如果自己工作中有需要用到的时候可以回忆到。
Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询、Comet技术、WebSocket技术、SSE(Server-sent Events)。
《开源Comet服务器iComet:支持百万并发的Web端即时通讯方案》
iComet的技术应用场景
iComet 分布式部署思路
iComet 本身没有分布式方面的工具。我可以说一个思路:
部署多台 icomet-server 实例;
用户调用 sign 申请通道时, 根据 uid 哈希到其中一台;
当往用户推送消息时, 根据uid哈希推送到他所在的那一台icomet-server上。
如果你可以开发, 那便写程序订阅 psub 接口, 在一个中心节点保存uid和icomet-server的对应关系(路由表)。
4如何支持百万并发连接 C1000K
需要两个步骤:
第一步: 操作系统要支持, 参考 http://www.ideawu.net/blog/archives/740.html;
第二步: 修改 icomet.conf,设置 max_channels: 1000000。
5iConet服务器内存占用情况
内存占用为 2.7KB 每连接。
iComet 简明开发者指南
1iComet服务端编译和运行
编译:
1
2
3
4
wget --no-check-certificate [url=https://github.com/ideawu/icomet/archive/master.zip]https://github.com/ideawu/icomet/archive/master.zip[/url]
unzip master.zip
cdicomet-master/
make
Start icomet server:
1
2
3
4
5
./icomet-servericomet.conf
# or run as daemon
./icomet-server-d icomet.conf
# stop
./icomet-servericomet.conf -s stop
Make a test via curl:
1
2
3
curl -v"http://127.0.0.1:8100/sub?cname=12&seq=1"
# open another terminal
curl -v"http://127.0.0.1:8000/push?cname=12&content=hi"
2Web端JavaScript调用方法
1
2
3
4
5
6
7
8
9
varcomet = newiComet({
channel: 'abc',
signUrl: 'http://127.0.0.1:8000/sign',
subUrl: 'http://127.0.0.1:8100/sub',
callback: function(content){
// on server push
alert(content);
}
});
3Java/Android客户端库
iComet的Java/Android客户端库:https://github.com/DuoZhang/iCometClient4j
iComet的客户端Demo:https://github.com/ideawu/icomet-demos
4Nginx + icomet
You can integrate icomet with nginx. If you are running you website on port 80 with domain www.test.com. That is you visit your website home page with this url:
1http://www.test.com/
Then you want to run icomet on the same server with port 80, for the concern of firewall issue. You can config nginx to pass request to icomet:
1
2
3
4
5
6
7
8
location ~ ^/icomet/.* {
rewrite ^/icomet/(.*) /$1 break;
proxy_read_timeout 60;
proxy_connect_timeout 60;
proxy_buffering off;
proxy_pass [url=http://127.0.0.1:8100;]http://127.0.0.1:8100;[/url]
}
Then, this url is used to subscribe to icomet channel xxx:
1http://www.test.com/icomet/sub?cname=xxx