用Mochiweb打造百万级Comet应用,第三部分(续2)
来源:互联网 发布:修改淘宝电子面单 编辑:程序博客网 时间:2024/05/17 08:38
提示:如有转载请注明作者 独舞 及出处
原文:A Million-user Comet Application with Mochiweb, Part 3
参考资料:Comet--基于 HTTP 长连接、无须在浏览器端安装插件的“服务器推”技术为“Comet”
MochiWeb--建立轻量级HTTP服务器的Erlang库
- // TODO - gracefully handle failure / reconnect / etc
- pthread_exit(0);
- }
- int main(int argc, char **argv)
- {
- // Launch the thread that runs the cnode:
- pthread_attr_t tattr;
- pthread_t helper;
- int status;
- pthread_create(&helper, NULL, cnode_run, NULL);
- int i;
- for(i=0;i<=MAXUSERS;i++) slots[i]=i;
- // Launch libevent httpd:
- struct evhttp *httpd;
- event_init();
- httpd = evhttp_start("0.0.0.0", 8000);
- evhttp_set_gencb(httpd, request_handler, NULL);
- event_dispatch();
- // Not reached, event_dispatch() shouldn’t return
- evhttp_free(httpd);
- return 0;
- }
最大用户数由#defined定义, 类似提及的mochiweb服务器, 他监听在8000端口,期待着用户用/test/<userid>的形式连接,erlang节点的名称被硬编码,他将为接收消息连接 httpdmaster@localhost
, erlang cookie, “secretcookie”. 相应的改变这些。
首先运行连接的erlang节点:$ erl -setcookie secretcookie -sname httpdmaster@localhost
编译运行:$ gcc -o httpdcnode httpdcnode.c -lerl_interface -lei -levent
$ ./httpdcnode
在erlang shell, 检查你能看到隐藏的c-node:erl> nodes(hidden).
[c1@localhost]
现在在你的浏览器中连接 http://localhost:8000/test/123
. 你将看到欢迎信息.
现在回到erlang shell - 向C节点发送一条消息:
erl> {any, c1@localhost} ! {123, <<"Hello Libevent World">>}.
注意我们没有用pid,以此我们用另外一种形式 {procname, node}.我们用 ‘any’ 作为进程名称,它可以被C节点忽略。
现在你能够通过erlang传递comet消息, 但是所有的http连接都被用libevent C语言编写的erlang节点管理。
在删除debug打印语句后, 我用同一个上面提到的客户端向http C节点服务器连接1M个用户, 这台机子显示少于10G的内存被使用。服务器进程常驻内存稳定在2G以下:
因此, 当处理大量连接时相比较webchiweb有很大的节省,对于用libevent服务器进程每个连接的常驻内存低于2KB。所有的都连接后,服务器状态如下:Mem: 32968672k total, 9636488k used, 23332184k free, 180k buffers
每个连接的内核/tcp 栈占了另外8KB内存,看起来有点高,但是我没有基础对象用来与之比较。libevent-cnode服务器需要多点的工作 . 他还不能聪明的处理从同一个用户来的多连接, 没有锁,假如你在一个消息被分发出去后断开连接,这时就有一个竞争条件存在.
即使这样, 我想这将被普遍化,以这种方式,他允许你用 Erlang 做很多有意思的事, 有一个C+libevent进程充当一个默默无闻的连接池.通过更多的包装代码和回调到erlang,你几乎不需要知道这个怎么运行的-C程序作为一个驱动或者一个C节点运行,一个Erlang包装器能给你一个合适的建筑于libevent的api. (看 这个 ,一个Erlang C驱动). 我将来在这上面会尝试更多。
最后的思考
我现在有足够的数据判断假如我为Last.fm发布一个大的伸缩性的comet系统我到底需要多少硬件.即使每个连接40KB有些浪费但不是过分的-内存很便宜,40GB能支持一个百万用户的系统不过分. 10GB更好.我将完成这个应用,我将在哪个地方构建发布它,人们可以试用它. 顺着这条路我将整理erlangmemcached客户端,我正在用且分发他
- 用Mochiweb打造百万级Comet应用,第三部分(续2)
- 用Mochiweb打造百万级Comet应用,第三部分(续)
- 用Mochiweb打造百万级Comet应用,第三部分 (待续)
- 用Mochiweb打造百万级Comet应用,第一部分
- 用Mochiweb打造百万级Comet应用,第一部分
- 用Mochiweb打造百万级Comet应用,第二部分
- 用Mochiweb打造百万级Comet应用(3)
- 用Mochiweb构建一个容纳百万级用户量的Comet应用程序(Part 2)
- 用Mochiweb构建一个容纳百万级用户量的Comet应用程序(2)
- 用Mochiweb构建一个容纳百万级用户量的Comet应用程序(Part I)。
- 用Mochiweb构建一个容纳百万级用户量的Comet应用程序(1)
- [译]使用Mochiweb构建百万级Comet程序,第一篇
- 使用Mochiweb基于Comet架设类似Facebook的Web聊天系统(原创)
- comet (WEB应用架构)
- comet 应用
- 编程珠玑 第三部分 应用
- 构建C1000K的服务器(2) – 实现百万连接的comet服务器
- 构建C1000K的服务器(2) – 实现百万连接的comet服务器
- 如何判断注册用户是否已经存在(membership验证)
- 关于探针的研究
- FIFO(转)
- SSH,SSL,TLS,PPP,L2TP,PPTP,IPSEC简介及比较收藏
- 克里斯蒂安
- 用Mochiweb打造百万级Comet应用,第三部分(续2)
- mysql 导入 导出
- test
- 经济危机生动描述
- Wincor 400系列出钞故障代码三
- 精确延时,不需考虑整数回转问题
- all- Integrated fixture design and analysis system based on service-oriented architecture [manufacturing]
- illustrator cs2 文字环绕方法:
- 类的嵌套以及类的私有构造函数