提示:如有转载请注明作者 小游戏
及出处
原文: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更好. 我将完成这个应用,我将在哪个地方构建发布它,人们可以试用它. 顺着这条路我将整理erlang
memcached客户端,我正在用且分发他
分享到:
相关推荐
Mochiweb是一个轻量级、高效的Web服务器和HTTP库,用Erlang编程语言编写。这个实例将帮助我们理解Mochiweb是如何工作的,并如何使用它来构建一个简单的Web服务器。Erlang是一种并发性极强、容错性高的语言,特别适合...
2. **Web 服务器进程模型**:Mochiweb 使用 Erlang 的进程模型来处理每个连接,这使得它非常适合处理高并发场景。每个连接都被分配到一个独立的进程,保证了请求之间的隔离,同时也易于实现并发处理。 3. **HTTP ...
2. **WebSocket接口**:利用Mochiweb的WebSocket支持,为聊天室提供实时通信的能力。用户通过WebSocket连接到服务器,发送和接收消息。 3. **消息存储与广播**:在Erlang进程中,可能会有一个或多个进程用于存储...
MochiWeb 的最新版本可在MochiWeb 的邮件列表位于 设置 MochiWeb 环境需要 Erlang OTP,可在使用项目创建一个新的 mochiweb:make app PROJECT=project_name 要使用特定目录中的项目创建新的 mochiweb: make app ...
RPSSL-Rock-Paper-Scissors-Spock-Lizard是一款简单但着名的2人游戏。 通常,它是第一人称自己玩的,但这是网络版本。 Web版本使用,该是运行时间很长的HTTP请求,可用于将服务器立即将数据推送到客户端。 每个...
**Erlang 高级特性和应用** Erlang 是一种高级编程语言,以其在并发处理、分布式计算和高可靠性方面的出色性能而闻名。在国内外,Erlang 已经被广泛应用于各种场景,如广告平台、社交网络、云计算、网络游戏以及...
在国外,Erlang被广泛应用于Ejabberd即时通讯服务器、RabbitMQ消息队列、CouchDB文档数据库、Mochiweb轻量级Web服务器以及Disco分布式计算框架。 Erlang与传统的操作系统如Unix相比,具有独特的设计哲学。在Unix中...
在Erlang Web框架中,Mochiweb和Cowboy通常被用于构建RESTful API、实时Web应用或者作为其他复杂系统的一部分。这些框架充分利用Erlang的actor模型,实现了进程间的异步通信,从而在处理高并发场景时能保持良好的...
MochiWeb是一个Erlang库... 要使用项目创建新的mochiweb,请执行以下操作:使应用程序PROJECT = project_name 要使用特定目录中的项目创建新的mochiweb:make app PROJECT = project_name PREFIX = $ HOME / projects /
【JavaScript + Delphi + ErLang讲座内容(4)】是一个专题讲座的第四部分,主要探讨了如何将三种技术——JavaScript、Delphi和Erlang——整合应用。这个压缩包包含了多个资源,帮助学习者理解这三者的交互和实际应用...
2. **rebar3与Websocket**:在rebar3项目中,可以通过编写`cowboy`或`mochiweb`的启动脚本来设置Websocket路由和处理函数。rebar3的自动编译和依赖管理特性使得在开发过程中无需手动管理依赖,提高开发效率。 四、...
- Mochiweb: 一种轻量级的Erlang Web服务器,可通过SVN检出并放置于 `$ERL_LIB` 目录下自动加入至编译路径。 - GeoIP数据库: 通过脚本从MaxMind获取并解压,存储于`priv`目录下。 - egeoip: 从Google Code获取,...
2. **多框架兼容**:支持各种框架,例如Spring、Grails、Express、Rails、Lift、MochiWeb等。 3. **多服务集成**:能够与多种数据服务和其他服务集成,如MySQL、PostgreSQL、MongoDB、Redis、RabbitMQ等。 4. **多云...
在此前提下,架构的设计可以分为三个主要部分:服务堆栈、服务拓扑和开源项目应用。 服务堆栈包括了WebAPI、MobileAPI、WebServer、InstantSearch、SystemFeed、SystemNotice、MQserver、CalfServer、OnlineServer...
网络机器 该项目始于Riak的创建者和维护者 。 由于Webmachine对于更广泛的Erlang社区的... 如果您不想这样做,它会作为“ make all一部分下载 快速开始 为用户提供了模板,可快速轻松地创建一个新的webmachine应用程序
Webmachine 是一个应用层,为 mochiweb 提供 HTTP 语义的特性,定义一个简单而清晰的连接应用的方式。 标签:Webmachine Web框架
例如,在 `handle_call/3` 中不要直接调用 `gen_server:call/2`,可以考虑使用 `gen_server:cast/2` 来异步处理消息。 ##### 3. gen_fsm详解 - **gen_fsm** 提供了一个框架用于实现有限状态机,适用于处理复杂的...
heroku-genfsmAn experimental Erlang app which deployed on HerokuSome Deploy Detail在 Heroku 上部署 Webmachine + Mochiweb + ErlyDTL 组合的 Erlang Web 应用
该框架基于Mochiweb(一款用Erlang编写的Web服务器)构建,旨在帮助开发者轻松构建遵循HTTP语义的服务,同时避免了在业务逻辑中直接处理HTTP相关的复杂性。 ##### 原则 - **默认行为**:Webmachine实现了一些默认...