`
idisc
  • 浏览: 36137 次
  • 性别: Icon_minigender_1
  • 来自: 秦皇岛
最近访客 更多访客>>
社区版块
存档分类
最新评论

用Mochiweb打造百万级Comet应用,第三部分(续2)

阅读更多

提示:如有转载请注明作者 小游戏 及出处

 

原文:A Million-user Comet Application with Mochiweb, Part 3

参考资料:Comet--基于 HTTP 长连接、无须在浏览器端安装插件的“服务器推”技术为“Comet”

               MochiWeb--建立轻量级HTTP服务器的Erlang库

 

  1.     // TODO - gracefully handle failure / reconnect / etc
  2.     pthread_exit( 0 ) ;
  3. }
  4.  
  5. int main( int argc, char **argv)
  6. {
  7.     // Launch the thread that runs the cnode:
  8.     pthread_attr_t tattr;
  9.     pthread_t helper;
  10.     int status;
  11.     pthread_create( &helper, NULL , cnode_run, NULL ) ;
  12.  
  13.     int i;
  14.     for ( i=0 ;i<=MAXUSERS;i++) slots[ i] =i;
  15.     // Launch libevent httpd:
  16.     struct evhttp *httpd;
  17.     event_init( ) ;
  18.     httpd = evhttp_start( "0.0.0.0" , 8000 ) ;
  19.     evhttp_set_gencb( httpd, request_handler, NULL ) ;
  20.     event_dispatch( ) ;
  21.     // Not reached, event_dispatch() shouldn’t return
  22.     evhttp_free( httpd) ;
  23.     return 0 ;
  24. }

 

最大用户数由#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更好. 我将完成这个应用,我将在哪个地方构建发布它,人们可以试用它. 顺着这条路我将整理erlang memcached客户端,我正在用且分发他

 

4
0
分享到:
评论
1 楼 idisc 2008-12-09  
终于翻译完了,有很多不对的地方,不过都是我自己理解的,望见谅,这三部分加起来有不少的翻译量,现在可以舒口气了

相关推荐

    mochiweb实例

    Mochiweb是一个轻量级、高效的Web服务器和HTTP库,用Erlang编程语言编写。这个实例将帮助我们理解Mochiweb是如何工作的,并如何使用它来构建一个简单的Web服务器。Erlang是一种并发性极强、容错性高的语言,特别适合...

    erlang mochiweb-test demo

    2. **Web 服务器进程模型**:Mochiweb 使用 Erlang 的进程模型来处理每个连接,这使得它非常适合处理高并发场景。每个连接都被分配到一个独立的进程,保证了请求之间的隔离,同时也易于实现并发处理。 3. **HTTP ...

    基于mochiweb的聊天室

    2. **WebSocket接口**:利用Mochiweb的WebSocket支持,为聊天室提供实时通信的能力。用户通过WebSocket连接到服务器,发送和接收消息。 3. **消息存储与广播**:在Erlang进程中,可能会有一个或多个进程用于存储...

    mochiweb:MochiWeb 是一个用于构建轻量级 HTTP 服务器的 Erlang 库

    MochiWeb 的最新版本可在MochiWeb 的邮件列表位于 设置 MochiWeb 环境需要 Erlang OTP,可在使用项目创建一个新的 mochiweb:make app PROJECT=project_name 要使用特定目录中的项目创建新的 mochiweb: make app ...

    erlang-rpssl-comet:使用Mochiweb和Comet技术的Erlang网页游戏-Rock-Paper-Scissors-Spock-Lizard

    RPSSL-Rock-Paper-Scissors-Spock-Lizard是一款简单但着名的2人游戏。 通常,它是第一人称自己玩的,但这是网络版本。 Web版本使用,该是运行时间很长的HTTP请求,可用于将服务器立即将数据推送到客户端。 每个...

    Erlang的高级特性和应用

    **Erlang 高级特性和应用** Erlang 是一种高级编程语言,以其在并发处理、分布式计算和高可靠性方面的出色性能而闻名。在国内外,Erlang 已经被广泛应用于各种场景,如广告平台、社交网络、云计算、网络游戏以及...

    Erlang高级应用和原理

    在国外,Erlang被广泛应用于Ejabberd即时通讯服务器、RabbitMQ消息队列、CouchDB文档数据库、Mochiweb轻量级Web服务器以及Disco分布式计算框架。 Erlang与传统的操作系统如Unix相比,具有独特的设计哲学。在Unix中...

    erlang web frame

    在Erlang Web框架中,Mochiweb和Cowboy通常被用于构建RESTful API、实时Web应用或者作为其他复杂系统的一部分。这些框架充分利用Erlang的actor模型,实现了进程间的异步通信,从而在处理高并发场景时能保持良好的...

    mochiweb:Mochi Media出色的HTTP库的一个分支-可以在https上找到其规范源

    MochiWeb是一个Erlang库... 要使用项目创建新的mochiweb,请执行以下操作:使应用程序PROJECT = project_name 要使用特定目录中的项目创建新的mochiweb:make app PROJECT = project_name PREFIX = $ HOME / projects /

    JavaScript + Delphi + ErLang讲座内容(4)

    【JavaScript + Delphi + ErLang讲座内容(4)】是一个专题讲座的第四部分,主要探讨了如何将三种技术——JavaScript、Delphi和Erlang——整合应用。这个压缩包包含了多个资源,帮助学习者理解这三者的交互和实际应用...

    erlang websocket

    2. **rebar3与Websocket**:在rebar3项目中,可以通过编写`cowboy`或`mochiweb`的启动脚本来设置Websocket路由和处理函数。rebar3的自动编译和依赖管理特性使得在开发过程中无需手动管理依赖,提高开发效率。 四、...

    erlang实战IP查询服务

    - Mochiweb: 一种轻量级的Erlang Web服务器,可通过SVN检出并放置于 `$ERL_LIB` 目录下自动加入至编译路径。 - GeoIP数据库: 通过脚本从MaxMind获取并解压,存储于`priv`目录下。 - egeoip: 从Google Code获取,...

    CloudFoundry - The building of the Open PaaS Presentation

    2. **多框架兼容**:支持各种框架,例如Spring、Grails、Express、Rails、Lift、MochiWeb等。 3. **多服务集成**:能够与多种数据服务和其他服务集成,如MySQL、PostgreSQL、MongoDB、Redis、RabbitMQ等。 4. **多云...

    张琨:教育社交平台的web架构分享

    在此前提下,架构的设计可以分为三个主要部分:服务堆栈、服务拓扑和开源项目应用。 服务堆栈包括了WebAPI、MobileAPI、WebServer、InstantSearch、SystemFeed、SystemNotice、MQserver、CalfServer、OnlineServer...

    webmachine:用于构建Web应用程序的基于REST的系统

    网络机器 该项目始于Riak的创建者和维护者 。 由于Webmachine对于更广泛的Erlang社区的... 如果您不想这样做,它会作为“ make all一部分下载 快速开始 为用户提供了模板,可快速轻松地创建一个新的webmachine应用程序

    Webmachine.zip

    Webmachine 是一个应用层,为 mochiweb 提供 HTTP 语义的特性,定义一个简单而清晰的连接应用的方式。 标签:Webmachine Web框架

    Erlang实战

    例如,在 `handle_call/3` 中不要直接调用 `gen_server:call/2`,可以考虑使用 `gen_server:cast/2` 来异步处理消息。 ##### 3. gen_fsm详解 - **gen_fsm** 提供了一个框架用于实现有限状态机,适用于处理复杂的...

    heroku-genfsm:一个Heroku Erlang应用程序-Genfsm

    heroku-genfsmAn experimental Erlang app which deployed on HerokuSome Deploy Detail在 Heroku 上部署 Webmachine + Mochiweb + ErlyDTL 组合的 Erlang Web 应用

    Good for restful API

    该框架基于Mochiweb(一款用Erlang编写的Web服务器)构建,旨在帮助开发者轻松构建遵循HTTP语义的服务,同时避免了在业务逻辑中直接处理HTTP相关的复杂性。 ##### 原则 - **默认行为**:Webmachine实现了一些默认...

Global site tag (gtag.js) - Google Analytics