分类: 云计算
2022-08-26 14:11:18
Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询、Comet技术、WebSocket技术、SSE(Server-sent Events)。
以上4种即时通讯技术各有各的优势和限制,很难决定最佳实践,开发者选型时根据自已的应用场景、开发代价、技术水平等选择适合自已的才是明智选择。
Comet技术简介
以即时通信为代表的web应用程序对数据的Low Latency要求,传统的基于轮询的方式已经无法满足,而且也会带来不好的用户体验。于是一种基于http长连接的“服务器推”技术便被hack出来。这种技术被命名为Comet,这个术语由Dojo Toolkit 的项目主管Alex Russell在博文Comet: Low Latency Data for the Browser首次提出,并沿用下来。
其实,服务器推很早就存在了,在经典的client/server模型中有广泛使用,只是浏览器太懒了,并没有对这种技术提供很好的支持。但是Ajax的出现使这种技术在浏览器上实现成为可能, google的gmail和gtalk的整合首先使用了这种技术。随着一些关键问题的解决(比如 IE 的加载显示问题),很快这种技术得到了认可,目前已经有很多成熟的开源Comet框架。
以下是典型的Ajax和Comet数据传输方式的对比,区别简单明了。典型的Ajax通信方式也是http协议的经典使用方式,要想取得数据,必须首先发送请求。在Low Latency要求比较高的web应用中,只能增加服务器请求的频率。Comet则不同,客户端与服务器端保持一个长连接,只有客户端需要的数据更新时,服务器才主动将数据推送给客户端。
关于iComet服务器
iComet 是一个使用 C++ 语言开发的支持百万并发连接的 comet/push 服务器, 支持百万级并发连接, 内存占用少, 性能优越. 可用于移动 App 的 Push Server(消息推送服务器), 或者用于 Web Push(Web 服务器推). 用于 Web Push 时, 支持的浏览器和操作系统平台包括: Safari(iOS, Mac), Firefox/Chrome(Windows, Mac), IE6+。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询
为何选择iComet
对于开发者, 为了快速和方便的开发, 应该选择一个支持 Comet 技术的 Web 服务器和一套 JavaScript 库(当然iComet也有开源的Java和Android客户端库可用)。iComet 就是这样的一套解决方案。
iComet 分布式部署思路
iComet 本身没有分布式方面的工具。我可以说一个思路:
部署多台 icomet-server 实例;
用户调用 sign 申请通道时, 根据 uid 哈希到其中一台;
当往用户推送消息时, 根据uid哈希推送到他所在的那一台icomet-server上。
如果你可以开发, 那便写程序订阅 psub 接口, 在一个中心节点保存uid和icomet-server的对应关系(路由表)。
如何支持百万并发连接 C1000K
需要两个步骤:
第一步: 操作系统要支持;
第二步: 修改 icomet.conf,设置 max_channels: 1000000。
1 2 3 4 5 6 7 8 9 |
var comet = new iComet({ channel: 'abc', signUrl: '', subUrl: '', callback: function(content){ // on server push alert(content); } }); |
You can integrate icomet with nginx. If you are running you website on port 80 with domain That is you visit your website home page with this url:
1 |
|
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=][/url] } |
Then, this url is used to subscribe to icomet channel xxx:
1 |
icomet/sub?cname=xxx |