我一直在研究Nitrogen Project,据说它是Erlang最成熟的Web开发框架。
作为一种语言,Erlang非常令人印象深刻。然而,在使用 Nitrogen 时,我对于使用Erlang相对不常见的语法(除非你是PROLOG本地用户)来构建UI并不太感兴趣。
与其他主流Web框架,如Django或Rails相比,您有什么经验?
我一直在研究Nitrogen Project,据说它是Erlang最成熟的Web开发框架。
作为一种语言,Erlang非常令人印象深刻。然而,在使用 Nitrogen 时,我对于使用Erlang相对不常见的语法(除非你是PROLOG本地用户)来构建UI并不太感兴趣。
与其他主流Web框架,如Django或Rails相比,您有什么经验?
我之前对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构建的服务器中,您比在其他框架上天真地构建的服务器更不可能花费时间等待锁定。当然,在其他系统中优化掉锁定延迟是完全可能的,但这真的是您想要做的吗?您想成为那些在服务变得流行后不得不学习如何优化其Web堆栈的第1000个团队,还是您宁愿将所有这些都交给工具来完成,以便您可以花时间做一些其他人尚未完成的事情呢?
Person:name()
而不是Person#person.name
)Erlang Web也应被视为成熟的技术。它是一个MVC框架,而Nitrogen则更加基于事件。这是个人偏好的问题。
除了Webmachine,我没有使用过其他提到的工具,我认为Webmachine是一个很棒的工具,但它不像其他的web框架。它是一个HTTP处理器,并且非常适合构建restful接口。
我还建议你给Erlang语法一个机会。Erlang是我最喜欢的语言之一。