是否有充分的理由避免针对非实时Web应用程序使用node.js?


29

我已经看到很多关于实时Web应用程序的Node.js多么出色的讨论-需要套接字,Comet,AJAX大量通信等等的东西。我知道,它的事件驱动,异步,线程驱动模型也适用于低开销的并发。

我也看到了Node.js教程,这些教程用于更简单的“传统”非实时应用程序(例如,标准博客示例,对于那些学习应用程序开发的人们来说,这似乎是标准的“ Hello World”)。我也知道,节点静态允许您提供静态资产。

我的问题是:是否有充分的理由要避免针对传统Web应用程序使用Node.js,例如分类,论坛,上述博客示例或为内部业务应用程序构建的CRUD应用程序?仅仅因为它在所有时髦的实时信息方面都表现出色,这是否就禁忌它用于更固定的用途?

我唯一能想到的就是缺乏成熟的库(尽管情况正在发生变化)。

(我问的原因是,我正在考虑放弃PHP以使用Node.js,主要是为了克服语言之间切换的阻抗不匹配问题,而且还可以重用验证代码和其他功能。我的超我劝告我选择最好的工具;但是,我没有太多的时间学习十五种语言及其所有的userland库,只是为了拥有一个全面的工具库,而且还可以确保Node.js可能为我提供比PHP /以后我必须开始考虑流量大的Apache。)

[编辑]到目前为止,谢谢大家。我只想看看在选择答案之前是否还有其他人会考虑。@Raynos的答案有点证实了我的想法,评论者的链接为我们提供了很好的思考,但是我想看看是否还有其他人有任何特定于节点的答案,例如“不要将节点用于问题X” '。(除了高CPU任务,我已经知道了:-)


1
@ default.kramer:感谢您的链接,我真的很喜欢!
扎克(Zach)

1
哇!更自以为是的家伙,是吗?在后续文章中,他似乎在说,对于高I / O和低CPU应用程序,事件系统和线程系统大致相同,问题出在新手程序员身上,他们不知道何时该放弃事件并产生一个新线程。但是程序员的无知并不意味着该工具不好,不是吗?我确实同意,使用以事件循环为中心的环境来执行CPU密集型任务有点奇怪,但这是邪恶的吗?
Paul d'Aoust

1
他对JavaScript的仇恨似乎也是一个重要问题,我担心这可能部分归因于他的论点。
Paul d'Aoust

@Paul-您可能应该把它和一粒盐一起吃。我对Node.js不太了解;我只是觉得这很幽默。(就像他的大部分作品一样)
default.kramer

@ default.kramer感谢您的提醒;我倾向于把人们的观点当作福音。他主要的有效批评似乎是您不应将Node.js用于CPU密集型任务。我对他对工人程序的批评感到困惑;为特定任务创建单独的工作人员有什么大问题?
Paul d'Aoust

Answers:


13

有什么充分的理由要避免针对传统Web应用程序使用Node.js

是的,如果您在Web平台X中已有N年,那么显然您可以更快地在X平台上开发应用程序。

如果要执行Y,并且平台X具有执行X的预制解决方案Y,则可以这样做。

为什么您应该使用一个平台而不是另一个平台的所有一般原因。

您为内部业务应用程序构建的哪种CRUD应用程序?

是的,还有其他平台可以让您更快地编写通用应用程序。

但是,那样说。我对节点有丰富的经验,不能断言我会选择另一个平台而不是节点,除非它为我提供了大量功能。

基本上,这是一个简单的问题

是否存在为我完成所有这些工作的工具?不,然后选择最方便的平台来编写工具。

没有可靠的理由说明node.js是一个不方便的平台(除了“我讨厌javascript”之外)


因此,您认为实用性原则(例如熟悉性,库的可用性等)是特定平台的强力论据,是吗?这些是好的想法,它们绝对是我正在考虑的事情。(我很惊讶您提倡开箱即用的解决方案;我以为您是个自己的小伙子!)
Paul d'Aoust 2011年

@ Pauld'Aoust我是个可口的家伙。但是我什么也没做,也没有最后期限。
雷诺斯2011年

嘿,谢谢。我确实记得您在node.js聊天中关于使用其他人的模型库(Backbone.js等)的评论,并且意识到我花了太多时间学习Backbone.js,而没有足够的时间仅仅利用(学习)JavaScript的优势。原型继承机制。好建议; 我现在感到轻松多了。
Paul d'Aoust 2011年

4
-1模糊。1)仅仅因为您在X领域拥有N年的经验-并不意味着您应该避免使用Node.JS。您是否根据经验提出了故意的无知?什么是“一般原因”?2)“其他可让您更快地编写通用应用程序的应用程序”-纯粹是主观的。3)“其他*比“*我恨* JavaScript的” -也是主观的,没有正当理由,以避免一个蓬勃发展的技术*拼写。
杰克斯通

@ClintNash您的某些原因与他没什么不同。“人力资源”与“ N年经验”是完全相同的。“ NodeJS不如传统框架那么成熟。” vs“是的,还有其他平台可以让您更快地编写通用应用程序,让我想到红宝石。” 也一样。它们不仅相同,而且您的对象比他的对象更具可测量性(客观性)。
aaaaaa

6

在使用node几周后,我会说是的,它非常酷。但不一定是您想要使用的东西来替换您的常规Web应用程序... imo也不是。

记住,节点是它自己的服务器。如果您要运行的不仅仅是一个node.js应用程序,这将带来复杂性。即,如果您在一台计算机上托管了多个站点/域。它与LAMP堆栈不同,在LAMP堆栈中,您可以在同一个服务器上(至少在端口80上)运行六个针对不同域的PHP应用程序。有一些节点框架可能使之成为可能,但这增加了复杂性,如果您坚持使用传统的Web平台,则不需要这些复杂性。(当然,您也可以通过将Web服务器放置在节点的前面来设置代理,但这不利于使用节点的好处)。

imo,Node非常适合传统的Web服务器一起使用。我现在组织的事情的方式是通过apache提供静态html / js / images,并通过长时间轮询节点应用程序来处理“实时”数据需求。


设置多个主机时+1的易用性绝对值得考虑。
Paul d'Aoust 2012年

将节点应用程序放置在Apache httpd或nginx服务器之后,并使用该应用程序的URI签名将请求路由到节点端口(一个或多个)非常简单。
TomG 2014年

+1-作为服务器端代理(“与传统Web服务器结合”)的node.js的概念在今年年初获得了广泛关注,值得研究-特别是如果您要管理大型传统体系结构时。这种设计模式似乎对企业有意义。但是,值得注意的是–这不是AVOID Node.js的原因,而是将其用于特定目的的原因。
杰克·斯通

4
-1-在节点之前放置一个代理(如nginx)是一个完美的用例,实际上在某些情况下比根本没有一个更安全,更高效。它不会破坏节点的任何好处。我倾向于在unix域套接字上运行我的节点应用程序,然后让nginx充当网守。
Scott Anderson

3

对节点有几秒钟思考的一个很好的理由不是技术性的-它的功能令人赞叹不已。

它们是业务,特别是人力资本,即知道它的程序员,它们的成本和可用性。学习起来并不难,但是与任何新技术一样,非常了解(或想要知道)的人只是大量工人中的一小部分。


因此,您认为使用Node代替更多传统的应用程序堆栈并没有太多反对;问题更多与现实世界中的担忧有关?
Paul d'Aoust 2012年

+1。人力资源和某些人不愿意学习JavaScript是不方便的事实。这个答案很好地说明了这一点。但是,避免Node“因为人们讨厌JavaScript”也不是逻辑上的进展。如果我们避免别人讨厌的每一项创新,从技术上讲,我们在哪里?无处。节点面临的挑战是A)获取新人才,或B)将传统人才培养成新人才。至此-自从约翰·雷西格(John Resig)创立Khan Academy的远见卓识以来,到处都有JavaScript代码学校如雨后春笋般冒出来。简而言之,这就是事情的方式。+1。说得好。
杰克·斯通

3

我们必须问这是一个很好的问题,以免太过先进。

我很好奇(像Paul d'Aoust一样)知道Node.JS的局限性在哪里。可悲的是,许多答案都充满了主观偏见和暂时相关的理由。

我问自己:我们能否过滤出主观偏见并获得有关此问题的可靠答案?

其余几点似乎是:

1. NodeJS不如传统框架成熟。正如Paul d'Aoust所建议的那样,这只是暂时相关的原因,并非完全避免-而是进行审查和尽职调查。期望以Web专业人士的身份完成我们的作业,确定技术最适合组织,他们的需求,他们的未来,团队(而不是我们)的工作是我们的工作。成熟是需要澄清和判断风险偏好的判断,而不是避免风险的判断。

2. NodeJS作为代理服务器。事先讨论的明智建议值得回顾和考虑。这是将Node与现有技术相关联用作前端接口代理设计模式的概念。但是,这也不是要避免使用节点的原因,而是要避免将其完全替换的原因。而是选择推论方法。

3.调试节点。与Joyent的核心Node开发人员交谈时,围绕可调试性和追溯由核心导致的问题的根本原因(基于单线程执行和无法查看过去的线程)有很多麻烦。这是值得考虑和评估的-但是(再次)对于普通用法而言,可能不会仅仅避免可能会推波助澜的边缘情况。也许您的特定需求会属于此类,也许不会。

4.人力资源。这是在此页上避免使用JS的最佳原因,而我拙见,这是一个鲜明而又不便的事实。这就引出一个问题:您的公司是否有合适的专业人才来在整个生命周期中观察该项目?如果没有,那么毫无疑问您需要避免使用NodeJS。或者考虑A)寻找合适的人才,或B)教育现有人才。

投诉: 我对JavaScript的抱怨是,很多原因是用户错误,而不是源源不断的语言失败。我们已经对“ The Hate JavaScript Diatribe”的许多要求进行了揭穿,并且我们将继续对更多内容进行揭穿。这样的问题-文档不够好,不够性感,但是人们不喜欢它,它是癌症,它是魔鬼,或者它太“容易犯错”(-CRichardson),主观有偏见的投诉,需要剔除这些投诉才能做出准确的公司决策。

最后,正确的答案可能是- 没有充分的理由来避免使用NodeJS。也许这就是为什么它正在经历快速的增长,采用和贡献。但是对于我们所有人来说,这里的答案可能是继续更好地评估,研究和理解NodeJS-并寻求具体的厌恶情绪。在寻求开放以准确了解Node.JS不成熟的地方时-我们确切地找到了需要改进的地方。那是一种祝福。

好问题。我仍然对有人提出避免NodeJS的更好理由感到好奇-而不是这些。


-1

对于非实时应用程序,在X上使用节点是否有任何好处:

  • 扩展性:Node具有良好的性能,但其他平台也有。PHP,Ruby,Python和Java均可扩展。您可以找到数以百万计的用户使用的BIG名称。
  • 前端和后端的一种语言:这是个玩笑,就像Java的“编写一次可在任何地方运行”
  • 炙手可热:唯一有效的方法。但没人会在乎您的网站使用的是前卫技术!

对于非实时应用程序,使用X over Node的好处:

  • 最佳实践:由于Node是新的,因此它的最佳实践比其他平台少,特别是针对CRUD Web应用程序。
  • Javascript语言:人们不喜欢Javascript。尽管Node.js很热,但Javascript却不是。这就是为什么人们创建Coffeescript来避免甚至为客户端编写Javascript的原因。
  • 开发速度:对于CRUD网站,经过多年测试和改进的旧的无聊框架(包括但不限于Rails和Django)。尽管您可以在Node中实现类似的应用程序,但是在您爷爷的框架中做起来就更容易了。
  • 稳定性:Node的Web框架以更快的速度变得越来越好。这意味着它们正在变化,并且在不久的将来将具有更多的API不兼容。
  • 库和工具:具有更多用户的较旧技术具有更多库和工具。

我的回答肯定在2015年将无效。2014年,对于非实时Web应用程序,请跳过Node,但请注意。

每个Web框架都有其长处。在这一点上使用它会很高兴。非实时Web应用程序不是Node Web框架的优点。


2
-1。我同意这个答案在2015年将无效。但这也是低票的原因。本质上,今天的决定就是明天的决定。如果我们看到它们只是暂时相关的,它将使上面的8个要点无效。1)扩展-Walmart Mobile扩展,不是避免使用Node的理由。2)同构JS不是开玩笑。没有理由 3)服务器性感?大多数用户只知道ux。4)最佳做法是主观的; 5)不热门?-主观6)容易吗?-主观。7)稳定性是暂时相关的一点。8)NPM计划在2014年通过Maven。在这里没有理由。下注。
杰克·斯通

-1

Node.js是非常流行的平台,它具有许多有趣的功能等等,但是使用工具是个人喜好。我给了Node.js四次,对此我感到不满意。这是我的原因。请记住,其中某些原因已过时,或者仅仅是个人原因:P

  • 我喜欢其他语言/语法(我喜欢Python,Scala,我最喜欢的语言是Prolog,是的)。
  • 我使用的框架和库的文档质量不如Java,Scala和Python库。
  • Node.js的设计者非常着迷于回调,而不是事件模型,观察者或期货。
  • 对于早在2005年开发的Ruby,Python和Java,我已经准备好解决方案,我只需要编辑配置文件即可。

2
-1-主观要点。“首选语法”,“文档质量不佳”,“强迫性回调”和“已经用我的语言完成”-都是模糊且主观的。我们以前听过这些。他们被揭穿了。没有理由在这里避免使用Node.JS。下注。
杰克·斯通

1
所有这些都是我公开表达的个人偏好。另外,您如何揭穿个人喜好?
David Sergey 2014年

-9

HTTP是无状态的,因此实际上没有非实时Web应用之类的东西,因此没有理由不能为所有内容使用节点。

也就是说,节点更适合于特定类型的应用程序体系结构。PHP是包含一些代码的html文件。节点是可选包含一些html的代码。

这意味着,如果您的应用是没有任何客户端脚本的标准html表单,则PHP会更容易。Node确实具有模板工具,但显然不如PHP那样成熟。

如果您有很多客户端脚本,并使用ajax保存数据,那么最终在服务器上将出现静态html客户端调用函数。这正是节点所擅长的。虽然不是通常使用CRUD应用程序构建的方式,但是使用正确的框架可以产生一些不错的东西。


关于HTTP是无状态且实​​时的观点;但是,我对实时的典型定义的务实关注更加感兴趣:大量的轻量级请求。仅仅启动三到四行JSON来启动一个新的PHP实例似乎有点矫kill过正。我是正确的,还是刚患上鹦鹉综合症?
Paul d'Aoust 2011年

如果您没有加载PHP,那么您正在加载javascript,并且涉及各种缓存,因此不必担心其中的差异。最大的区别在于编码风格和可维护性-两种平台都可以输出HTML或JSON,但是PHP是专为用于编辑静态html文件的人员而设计的,而node是专为用于现代javascript编程的人员而设计的。
汤姆·克拉克森

我知道我确实需要一段时间加载一个解释器,但是我看到让一个解释器实例一直运行(当然,对于低CPU应用程序)就像在Node.js中那样有好处,而不是让解释器旋转启动并终止每个请求,如PHP中那样。
Paul d'Aoust 2011年

是的,鉴于最近在该领域的竞争,我也希望js在单个请求级别上具有更好的性能。但是,我认为这只是差异的一个相对较小的部分-使用节点,您可以直接控制并且可以精确地处理请求的代码量,而任何假定您正在服务页面的基于模板的系统都会增加不必要的开销和复杂性其他情况。
汤姆·克拉克森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.