Home > misc > 让人惊讶的 Erlang-Web

让人惊讶的 Erlang-Web

August 20th, 2009 :: jackyz

Erlang-Web 并不是一个“新”项目,它的出现已经有一阵子了(第一次的公布是在 2008 年的 11 月)。一直以来,因为并没有太多的机会去实际使用 Erlang 来写“传统” MVC 的 Web 程序(了解我的人都知道,我一直在鼓吹采用激进的纯客户端的 JavaScript 的 MVC 来做 Web 开发),所以并没有去真正了解它的特性。这种状况一直持续到最近,一个偶然的原因,需要做一点传统的 Web 开发,这才有机会回头再来审视众多的服务端 MVC Web 开发技术,并有机会认识 Erlang-Web 的强大。

对于一个全新的传统 Web 项目而言(通常这意味着内容要对搜索引擎友好、URL Friendly、有节制的使用 Ajax 等等需求),对于服务端开发框架的考察无非就是需要关注如下这么几个方面:

首要考虑的是编码的“效率”,在这个坐标上,通常都是认为 Ruby On Rails 和 Python Django 之类的“Full Stack Web Framework”具有较高的得分。大量的默认习惯性配置,代码模版,等等,借助这些设施,通常较少的实际编码就能得到相当不错的成果。

然而,这类 Full Stack 框架通常“水比较深”,也就是说,它什么都提供了,但是有点“过了头”。稍微有点“另类”的想法通常容易导致痛苦。在这个坐标上,反而会希望框架再“谦逊一点”,毕竟只是一个 MVC 设施,简洁明了和可裁减也很重要。越简单的越好改,对熟手而言,用起来更能随心所欲。

再然后就是省时省力上的考量,和美工的流程配合、上传下载、URL Mapping、拦截设施、Email模块、与其他系统的接口,等等,该有的都要有,不该有的有了也好,不强买强卖就行。简而言之,能用较少的“脑力”来完成任务,就是上上大吉。

于是,我惊讶的发现自己在越来越多的关注 PHP 之类的技术(其中的一些确实是很不错的选择)。但要知道,对我个人而言,使用这门语言大约是在 9 年以前。这时我才想起曾经听过 Erlang-Web 的大名。没准怎么样呢,大不了回去再用 PHP ,先看看再说。我们了解一下它的特性:

  • Annotations —— 支持“区分主要任务和外围事务”的设施,帮助清晰和重用代码。
  • Architecture of types —— 类型系统,并用这一类型系统来对应界面。
  • Dispatching and Reverse dispatching —— 从 Friendly URL 映射到程序,及其反向功能——生成 Friendly URL。
  • Validation —— 校验用户输入。
  • Internationalization —— 传说中的 i18n 支持。
  • Request dictionary —— 在其他 MVC 中被传来传去的,什么都往里扔的 Request Object 的对应物。
  • DBMS —— 数据库支持,目前只支持 Mnesia 和 CouchDB (太 Erlang 了一点,要是能支持 MySQL ,就算是做做样子也好,胜在够有亲和力呀)。
  • Project configuration file —— 组织配置文件的设施。
  • Data flow —— 处理默认值,格式化参数等等的设施。
  • Template engines —— 模版引擎,目前支持 wtpl 和 Django 的 dtl 模版语言。
  • 其他 —— 一些有意思的组件,如 twitterl, wpart_rss, ew_backup, wpart_erlsyntax, e_auth, e_auth_dets 名字都很简约,可以直接望文生意。

配上 Erlang 内置的分布式和高并发特性,再加上 Mnesia 的诸多优势,看起来还是有一些亮点吧。当然了,特性并不完美,而且学习曲线很可能还有一点“陡峭”。但对于一个处于活跃开发周期中的项目而言,这应该不是什么大问题。长久以来流行在 Erlang 社区的这个说法——“Erlang 并不适合开发 Web 项目”——现在是不是时候改变了呢? ;)

misc

  1. sw2wolf
    August 20th, 2009 at 20:45 | #1

    “Erlang 并不适合开发 Web 项目”可能主要指其字符串处理能力不强! 个人觉得Erlang 很适合 Web 项目, 尤其是试用了yaws后, 感觉Erlang在这方面很有优势!

  2. August 20th, 2009 at 22:14 | #2

    这个要留待市场来检验了.

  3. sw2wolf
    August 21st, 2009 at 09:27 | #3

    问个小问题, 以下函数用来计算: 从给定日期起经过N个交易日的日期.
    date_by_ntday({Y,M,D}, 0) -> {Y,M,D};
    date_by_ntday({Y,M,D}, NTday) ->
    case is_trade_day({Y,M,D}) of
    true -> date_by_ntday(next_day({Y,M,D}), NTday – 1);
    _ -> date_by_ntday(next_day({Y,M,D}), NTday)
    end.

    问题是如果给定日期是交易日, 则会少算一天. 那么如何在不改变函数接口的情况下, 解决此问题呢?

  4. dsun
    August 21st, 2009 at 11:02 | #4

    是这个意思吗?(最好给出测试用例,这样好理解一些)。

    date_by_ntday(Date, NTDay) -> %% 接口未变
    update_start_date(Date, NTDay).

    update_start_date(Date,0) -> Date;
    update_start_date(Date,NTDay) -> update_next_date(next_day(Date),NTDay).

    update_next_date(Date,0) -> Date;
    update_next_date(Date,NTDay) ->
    do_progress(is_trade_day(Date),Date,NTDay).

    do_progress(true,Date,NTDay) -> update_next_date(next_day(Date),NTDay-1);
    do_progress(false,Date,NTDay) -> update_next_date(next_day(Date),NTDay).

  5. sw2wolf
    August 21st, 2009 at 17:11 | #5

    谢谢dsun, 是这个意思。
    我脑筋一时没转过弯, 先跳过给定日期就可以了。

  6. Xingdong
    August 21st, 2009 at 18:26 | #6

    确实如此,我们公司一直致力于开发Erlang Web为开源的网页架构,所有公司运行和开发的网站都用Erlang Web:
    * Erlang Training & Consulting Ltd
    * ProTest-Project
    * Erlang Web
    * Streamfile
    * Umbria Rentals
    * Erlang Factory
    * Erlang Programming (Book)
    具体参见:
    http://www.erlang-web.org/about.html

  7. Jocelyn
    October 28th, 2009 at 18:51 | #7

    @Xingdong

    您好,看到您的流言,感觉你一定是 erlang web的高手,我现在遇到了些 关于 erlang web 的问题,可以讨论下么?

  8. Jocelyn
    October 28th, 2009 at 18:55 | #8

    @Jocelyn

    @Xingdong
    我的邮箱是jocelyn87426@gmail.com

  1. No trackbacks yet.