论坛首页 综合技术论坛

facebook chat on erlang

浏览 6526 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-05-17  
http://www.facebook.com/notes.php?id=9445547199
Facebook chat 跟踪报导 —— comet with mochiweb
话说 facebook 推出了支持高并发的 web im 引起众“hacker”(与 linux hacker 中的 hacker 相同的那个词)的一片哗然,纷纷出手研究其秘密。互联网上迅速的出现了一批“拆解 facebook webim”的文章。这里就是其中相当有意思的一篇。其中的干货如下:

1 作者放出 firebug 发现,http header 的 server 字段赫然写着 MochiWeb/1.0 的字样。

2 作者开动脑筋,在 mochiweb 基础之上,写了一个“最简单”的 facebook webim 概念模型,mochi loop 的核心代码如下:

...
'GET' ->
  case Path of
    "chat" ->
      % 1) subscribing
      Room ! {self(), subscribe},
      % 2) waiting
      receive
        Message ->
          % 3) everything went right
          Req:ok({"text/plain", Message})
      after 10000
        % 4) oOops, too long buddy.
        room ! {self(), unsubscribe},
        Req:not_found()
    end;
...
简而言之就是:在 browser 和 mochiweb 之间保持 10 秒的长连接,这(10s的)期间收到的任何消息都会即时发送给 browser ,然后再由 browser 内的代码再次发起下一个连接。作者提供了完整例子代码的下载。PS.关于这一实现方式的更多说明也可以参考拙作“the google way”。

当然这只是一个“概念模型”,距离“实用价值”仍有一段距离。比如:这个 web 层如何与 ejabberd 接起来,如何识别同一个用户,如何增加更多的“聊天逻辑”。

有兴趣(有时间)深入研究的读者可以移步阅读原文。如果看不到原文,请留言,以便“进行盗版”。

http://erlang-china.org/misc/facebook_comet_in_mochiweb.html
   发表时间:2008-05-17  
关于mochiweb 相比 yaws / inets httpd 而言,它的目标并不是 apache 之类的软件,它并不是一个完整的 web server (没有cache等机制,因而也不做任何加速动作),它只是一个实现 web server 的工具包(这也就意味着,它直接通过代码来扩展,你可以在它的基础上做任何事)。正因为此,在“需要定制 Web Server”的情况下,它成为一个非常不错的选择(比如,配置在 enginx 的后面,专门用于动态内容的生成)。
Tony Arcieri 写了一篇 《The black art of Erlang’s parameterized modules》。介绍了“参数化的module”(parameterized modules)这是一种“undocumented and unsupported feature”。

这种机制就好比,你有了 module 的一个 instance 。没错,就是在 oop 中非常常见的 instance (实例)。具体的,这种语法是这样的:

声明一个 parameterized module:

-module(foo, [Bar, Baz]).

这样声明的 module 会自动 export 一个 new 函数(多像 method),可以这么用:

Module = foo:new("Bar", "Baz"),
Module:quux().

that’s all.

一个“类”实例化多个“对象”,每个实例保持一个自己的“状态”,各个“对象”的“方法”在自己的“状态”中执行。——这是 OOP 下的“标准思维方法”。在 MochiWeb toolkit 中,就应用了这种语言机制来保存每一个request。

这是一种 Erlang 的语法糖,很好的模拟了 OOP way 的编程思路。而实际上,通过参照作者自己写的“文档”。你会发现,他仍是用 Erlang 的标准方式(behaviour)来实现的,并没有从语法层面做出什么本质的改变。另外要注意的问题是它是“undocumented and unsupported”的特性,所以“use at your own risk”,非官方支持的特性,并没有什么保证。

顺便提一句,在 EShell 中,不能直接使用这个语法,而必须是从某个 module 来调用。

http://www.erlang.se/workshop/2003/paper/p29-carlsson.pdf
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics