我一直在查看氮计划,它应该是Erlang最成熟的Web开发框架.
Erlang作为一种语言,令人印象深刻.然而,关于氮,我不太热衷于使用Erlang的相当不常见的语法(除非你是PROLOG中的本地语言)来构建UI.
与其他主流 Web框架(如Django或Rails)相比,您对它的体验是什么?
到目前为止,我对氮气做的很少,但我几个月来一直在监控邮件列表,所以我觉得我有一些有用的东西可以说.
对于你对Erlang和Nitrogen框架的语法的关注,我会回答这听起来像是一个不熟悉而不是不合适的纯粹案例.客观地说,HTML不是一种美丽的语言,它有很多怪癖.你现在已经习惯了,所以看起来并不那么糟糕.给氮/二郎一个机会,你可能会发现你很快就习惯了它.
关于与其他语言和框架进行比较的问题,我认为最大的区别在于使用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的服务器上的锁,而不是在其他框架之一上天真地构建锁.当然可以优化其他系统中的锁定延迟,但这真的是你想要做的吗?你想成为第一千个必须学习如何在服务变得流行之后优化其网络堆栈的团队,或者你愿意把它全部留给工具,这样你就可以把时间花在做其他人没有做过的事情上?
我也曾经关注过笨重的Erlang语法.我已经构建了一些工具来减轻日常Web编程的烦恼,也许你会发现其中一个或两个都有用:
ErlyDTL是Django模板语言的Erlang实现; 它不适用于氮气,但它可以在其他框架中使用,例如Zotonic,Erlang Web,BeepBeep和Chicago Boss
Chicago Boss是一个全栈Erlang框架,可以执行大量代码生成,因此您可以使用函数调用而不是Erlang的相当冗长的记录语法来访问数据字段(例如,Person:name()
而不是Person#person.name
)
请注意,Nitrogen不包含数据库层,因此它与Rails或Django不具有可比性.有关数据库驱动框架的全面比较,请查看我对此StackOverflow问题的回答:
/sf/ask/17360801/#2898271