折腾篇(一):谈关于在线即时消息的实现

最近折腾在线IM消息系统,参看58、Facebook等右下角

方案:
1.PHP
2.nodejs+websocket
3.APE(Ajax Push Engine)跟nodejs没什么区别,官网连接:http://www.ape-project.org/

纯php方案:
典型的comet,前端js发起ajax请求,php hold住进程,直到有新消息,输出,链接断开,js接收到,处理消息,重新发起ajax请求,php hold住进程……

需要服务器足够强悍,每一个在线用户都会发起一个ajax请求,也就是说每一个在线用户都会在服务器上产生一个php-cgi进程(apache就更难以想象了)。如果需要存储聊天记录,数据存储就又是一个新的问题。群里提供了异步队列解决方案,可以参考。http://kr.github.com/beanstalkd/。。。你要有那么多money多买几台服务器做个负载均衡也不是不可以 🙂

Nodejs和APE的WebSocket方案就不用多说了。nodejs的socket.io.js官网说可以兼容IE5.5以上版本浏览器。具体的实现方法尚未知晓。
不过此方案的成本相比上边的纯php实现方案是小巫见大巫。

欢迎再提出更好的解决方案。:)

====补充:
nginx有一个Module叫:nginx_http_push_module。可以交由nginx来做push(comet)。一样的原理,ajax发起一个请求,不过这个请求是nginx接收。

location /getmsg {
    set $push_channel_id $arg_id;
    push_subscriber;
    send_timeout 3600;
}
location /send {
    internal;
    set $push_channel_id $arg_id;
    push_publisher;
    push_message_timeout 5m;
    push_message_buffer_length 10;
}

getmsg就是ajax发起请求的地方。$arg_id指定一个get参数为id。即:http://host/getmsg?id=channel_name
send就是服务端发起请求,即:post -> http://localhost/send?id=channel_name
设置send只允许服务器内部访问。然后前台提交信息到http://host/send.php。send.php接收以后做权限等相关验证,全部通过后,发送到指定频道即可。内容可自定义,可以是text、xml、json等。
地址:http://pushmodule.slact.net/
官网右侧有一个在线聊天室,就是用http_push_module做的。可以玩玩。

碎觉

去打赏

您的支持将鼓励我们继续创作!

[微信] 扫描二维码打赏

3 thoughts on “折腾篇(一):谈关于在线即时消息的实现”

发表评论

电子邮件地址不会被公开。