【问题标题】:What is your experience with Nitrogen on Erlang?你在 Erlang 上使用 Nitrogen 是什么体验?
【发布时间】:2012-09-08 16:58:05
【问题描述】:

我一直在查看Nitrogen Project,它应该是 Erlang 最成熟的 Web 开发框架。

Erlang 作为一门语言,令人印象深刻。然而,关于 Nitrogen,我不太热衷于使用 Erlang 相当不常见的语法(除非你是 PROLOG 中的本地人)来构建 UI。

与 Django 或 Rails 等其他主流 Web 框架相比,您对它有何经验?

【问题讨论】:

  • 如果 vanilla Erlang 语法让您感到困扰,那么有两个替代方案可以为您提供具有替代语法的 Erlang:LFE(Lisp Flavored Erlang),它为您提供完整的 Lisp 语法,位于 github.com/rvirding/lfe; Efene 为您提供更类似于 javascript/python 的语法,位于 marianoguerra.com.ar/efene

标签: erlang web-frameworks nitrogen


【解决方案1】:

到目前为止,我在 Nitrogen 方面所做的工作很少,但几个月来我一直在关注邮件列表,所以我想我有一些有用的信息要说。

对于您对 Erlang 和 Nitrogen 框架的语法的担忧,我的回应是,这听起来像是纯粹的不熟悉,而不是不适合。客观地说,HTML 并不是一门漂亮的语言,而且它有很多怪癖。你现在已经习惯了,所以看起来并没有那么糟糕。给 Nitrogen/Erlang 一个机会,你可能会发现你很快就会习惯它。

对于您关于与其他语言和框架进行比较的问题,我想说最大的区别在于,使用 Nitrogen,整个网站都直接由 Erlang 运行时提供服务。 Ruby on Rails 有这样的模式,但它只用于测试。许多其他框架甚至不提供在单个长时间运行的进程中运行所有内容的选项。

在单个长时间运行的进程中运行整个 Web 应用程序及其底层基础架构对网站的运行方式具有重大影响:

  • 使用 Apache,每 N 个连接(其中 N=500 左右),每个子节点都会被杀死,并且您不能说给定的子节点是否总是会处理给定客户端的所有请求。由于 HTTP 是无状态的,但 Web 应用程序几乎总是需要一些客户端状态,因此 Apache 子节点必须重建其客户端状态视图,作为处理新连接的一部分。默认情况下,这意味着返回磁盘以获取有关该客户端存储的持久数据。有像memcached 这样的替代方案,但这些不是内置在 LAMP 类型堆栈的核心中。使用 Erlang,没有任何东西会定期被杀死,而且 Erlang 提供了标准工具,例如 Mnesia,它提供了磁盘支持的内存数据库。

    顺便说一句,如果您熟悉nginx,它的构建原理与 Erlang 相同,并且出于同样的原因它很快。 nginx 和运行 web 服务器的 Erlang 实例之间的主要区别在于 nginx 不是编程环境,因此它仍然需要将大量处理委托给外部代码。这意味着它与 Apache 共享相同的 IPC 和持久状态问题。

  • 由于运行时会持续运行并且是一个功能齐全的编程环境,因此您可以在 Erlang 中构建系统的更多部分,而不是使用捆绑在一起的 LAMP 类型堆栈。这放大了上述好处。系统的各个部分可以通过消息传递和 Mnesia 而不是重量级的 IPC 和 MySQL 进行协调,并且所有部分都保持正常运行,从而减少了耗时的状态重建。

  • 十几个 Apache 子节点都访问持久客户端状态数据存储是一个基于锁的毛球。这些框架都透明地为您处理锁定等问题,但它们无法隐藏的是正确执行所有这些操作所需的时间。

    Erlang 是一种不纯的函数式语言,它暗示但不要求数据纯洁;它在构建时也考虑到了多处理,明确了运行时设计的核心。这两个事实意味着您不太可能花时间等待基于 Erlang 的服务器中的锁,而不是天真地构建在其他框架之一上的服务器。当然可以优化其他系统中的锁定延迟,但这真的是您想要做的吗?您是否想成为第 100 支必须学习如何在服务流行后优化其 Web 堆栈的团队,还是宁愿将这一切都交给工具来完成,这样您就可以把时间花在做其他人没有做过的事情上?

【讨论】:

    【解决方案2】:

    我也曾经担心过笨重的 Erlang 语法。我已经构建了几个工具来减轻日常 Web 编程的烦恼,也许你会发现其中一个或两个都有帮助:

    • ErlyDTL 是 Django 模板语言的 Erlang 实现;它在 Nitrogen 中不可用,但在其他框架中可用,例如 Zotonic、Erlang Web、BeepBeep 和 Chicago Boss

    • Chicago Boss 是一个全栈 Erlang 框架,它执行大量代码生成,以便您可以通过函数调用而不是 Erlang 相当冗长的记录语法来访问数据字段(例如,Person:name() 而不是 Person#person.name )

    请注意,Nitrogen 不包含数据库层,因此它无法与 Rails 或 Django 相比。要全面比较数据库驱动的框架,请查看我对 StackOverflow 问题的回答:

    https://stackoverflow.com/questions/1822518/current-state-of-erlang-web-development-frameworks-template-languages/2898271#2898271

    【讨论】:

    • 数据库层可以从 Zotonic 中选择,他们使用的是 Postgresql。 (数据库层在 Erlang 中实现了无数次,因此使用最好的非常重要。我会选择 Zotonic)
    • Re: "no DB in Nitrogen",Rusty Klophaus,Nitrogen 的创建者和主要开发人员正在为 Basho 工作,该公司推出了 Riak,一个为支持网站而设计的分布式数据库。 (Basho 还推出了 Webmachine,在另一个答案中提到。)Rusty 在 Vimeo 上做了一个演示,说明如何将两者结合使用:vimeo.com/8258045 在我看来,这三种技术可能会以某种方式一起发展。跨度>
    【解决方案3】:

    如果我是你,我会查看Webmachine。它非常简单、快速,并且界面由您决定。

    【讨论】:

      【解决方案4】:

      Erlang Web 也应该被认为是成熟的。它是一个 MVC 框架,而 Nitrogen 更基于事件。这是一个偏好问题。

      除了Webmachine,我没有使用过这里提到的其他工具,我认为它是一个很棒的工具,但它不像其他工具那样是一个Web框架。它作为 HTTP 处理器,非常适合构建 restful 接口。

      我还建议你给 Erlang 语法一个机会。 Erlang 是我最喜欢使用的语言之一。

      【讨论】:

        猜你喜欢
        • 2020-08-01
        • 1970-01-01
        • 2014-04-05
        • 2021-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-22
        相关资源
        最近更新 更多