作者是各自领域的专家,并就其所展示经验的主题撰写文章. 我们所有的内容都由同一领域的顶级专家同行评审和验证.
Tomislav Capan的简介

Tomislav Capan

Tomislav是AWS认证的开发者 & 具有10年以上经验的解决方案架构师和技术顾问.

Previously At

Deliveroo
Share

Introducción

JavaScript的日益流行带来了一些变化, 包括web开发的表面, 因为今天是完全不同的. 今天我们可以在网络上做的事情, 在服务器上运行JavaScript, como también en el navegador, 这在几年前很难想象, 或者封装在Flash和Java等沙箱环境中.

Antes de indagar en Node.js, 您可能想了解通过stack使用JavaScript的好处, 统一语言和数据格式(JSON), 这允许开发人员资源的最佳重用. 因为这更多的是JavaScript而不是Node的好处.具体来说,我们在这里就不多说了. 然而,将Node集成到堆栈中是一个关键优势.

正如维基百科所建议的:“节点.js是一个跨平台运行时环境, de código abierto, 对于基于ECMAScript编程语言的服务器层(但不限于此), asíncrono, 在基于谷歌V8引擎的面向事件架构中使用数据I/O.“除此之外,值得注意的是Node的创建者.js, Ryan Dahl的目标是创建具有插入功能的实时网站, “受Gmail等应用的启发”. En Node.js, 为开发人员提供了一个非阻塞工作的工具, event-driven I/O paradigma.

经过20年基于请求-响应协议范式的无状态协议, 最后,我们有了实时web应用程序, 双向连接.

En una frase: Node.js通过Websockets使用push技术在实时web应用程序中闪耀. 这有什么革命性的? Bueno, 在20多年的无国籍网站建立在无国籍请愿-回应范式之后, 最后,我们有了实时web应用程序, 双向连接, 客户端和服务器都可以在哪里开始通信, 允许他们自由地交换数据. 这与典型的web响应范式形成了鲜明对比, 客户总是在哪里开始沟通. 此外,一切都基于Open Web Stack (HTML, CSS和JS),运行在标准端口80上.

我们可以说,我们已经以Flash和Java applet的形式使用这种格式很多年了, pero en realidad, 它们只是一个沙箱环境,使用web作为传输协议交付给客户端. Además, 隔离运行,通常通过非标准端口操作, 哪一个可能有额外的使用要求.

Con todas sus ventajas, Node.js现在在许多依赖其独特优势的高调公司的技术堆栈中扮演着关键的角色.

在本文中,我不仅将讨论如何获得这些优势, 还有为什么您可能想要使用Node.为什么不使用一些经典的web应用程序模型作为示例.

¿Cómo funciona?

La idea principal de Node.js: uso no-bloqueante, event-driven I/O, 在分布式设备上运行的应用程序大量使用实时数据的表面上保持轻量级和高效.

Increíble ¿no?

这实际上意味着Node.js并不是主导web开发世界的新平台. 相反,它是一个满足特定需求的平台.

这种理解是绝对必要的. 绝对不想使用Node.js para operaciones intensivas de CPU; de hecho, 使用它进行重计算几乎会抵消它的所有优点. Node真正突出的地方是快速和可扩展的网络应用程序构建, 因为它能够以高性能处理大量同时连接, 这相当于高可伸缩性.

它在内部是如何工作的很有趣. 传统的web服务技术,其中每个连接(请求)生成一个新的子流程, 恢复系统RAM,最终达到可用RAM的最大数量, Node.js在单个线程上运行, 不使用i / o呼叫阻塞, 允许您支持数以万计的同时连接(在循环的情况下持有).

快速计算:假设每个线程都有一个潜在的2mb内存, 它将在一个有8gb RAM的系统中运行,理论上最大为4.000个同时连接,加上线程之间上下文切换的成本. 这是传统web服务技术通常处理的场景. Evitando todo eso, Node.js实现了超过1M的并发连接的可伸缩性级别(como una prueba de concepto).

alt

Existe por supuesto, 在所有客户请求之间共享单个线程的可能性, 将其转化为编写Node应用程序的潜在失败.js. En primer lugar, 沉重的计算可能会停滞不前,并给所有客户端带来麻烦(稍后将详细介绍),因为传入的请求, 这将被锁定,直到这样的计算完成. En segundo lugar, 开发人员需要非常小心,不允许内核冒泡异常(顶部), 这将导致Node实例.js se terminase (有效地锁定程序).

用于避免异常的技术将错误传递给调用,作为参数调用(而不是拉出它们), 和其他环境一样). 即使有例外出现, existen varias herramientas disponibles para supervisar el proceso de Node y realizar la recuperación necesaria en caso de una emergencia(aunque no serás capaz de recuperar las sesiones de los usuarios); siendo la emergencia más común el módulo Forever, 或者使用advenedizo和monit外部系统工具的不同方法.

NPM: El Node Package Manager

Cuando hablamos de Node.js, 有一件事绝对不能忽略,那就是使用每个Node安装的默认NPM工具将其集成到包管理支持中.js. NPM模块的想法与Ruby Gemas非常相似:一组可重用的组件,通过在线存储库轻松安装公开可用, 使用版本和依赖管理.

模块包的完整列表可以在NPM网站Https://npmjs上找到.org/或使用Node自动安装的NPM CLI工具访问.js. 该模块是一个对所有人开放的生态系统, 任何人都可以发布自己的模块,该模块将包含在NPM存储库中. 关于NPM的简要介绍(有点旧,但仍然有效)可以在 http://howtonode.org/introduction-to-npm.

一些最流行的是NPM模块:

  • express - Express.js,灵感来自Node的web开发框架.js,是大多数Node应用程序的事实上的标准.js de hoy en día.

  • connect —Connect是Node的可扩展框架HTTP服务器.js, que proporciona una colección de alto rendimiento de plugins conocidos como middleware; sirve como fundamento para expresar.

  • socket.io y sockjs -服务器组件是目前最常见的两个websockets组件.

  • Jade -最流行的模板引擎之一,灵感来自HAML, Express的一个缺陷.js.

  • mongo y mongojs - mongoDB包装器,为Node中的mongoDB对象数据库提供API.js.

  • redis - Redis biblioteca cliente.

  • coffee-script CoffeeScript编译器,允许开发者编写他们的Node程序.js con café.

  • Underscore (lodash, lazy) -最流行的JavaScript实用程序库,打包用于Node.js, 以及它的两个对手, 承诺通过采用稍微不同的应用程序方法来提高性能.

  • forever -可能是确保某个节点脚本连续运行的最常见的实用程序. Mantiene su proceso de Node.js在生产和面对任何意外故障.

La lista es interminable. 每个人都可以使用大量非常有用的软件包(无意冒犯我在这里省略的软件包).

Ejemplos en donde Node.js debe utilizarse:

Chat

它是最典型的实时和多用户应用程序. Desde IRC (en el día), 通过许多专有和开放协议在非标准端口上旋转, 能够在Node中检测所有内容.js与websockets运行在标准端口80.

聊天应用程序非常适合Node.js: es ligera, 它具有高数据密集型流量(但低/计算处理),是一个在分布式设备上运行的应用程序. 这也是一个很好的学习用例, ya que es demasiado simple, 但与此同时,它涵盖了在典型Node应用程序中可以使用的大多数工具.js.

让我们试着描述一下它是如何工作的.

En el ejemplo más sencillo, 我们在网站上只有一个聊天室,人们可以来这里和一个人或几个人交换信息. Por ejemplo, 假设网站上有三个人都连接到我们的留言板.

在服务器端,我们有一个简单的Express.js实现了两件事:1)获得一个' / '请求控制器,为包含留言板和一个' send '按钮初始化新传入消息的网页服务, 2)一个websocket服务器,它监听websocket客户端发出的消息.

En el cliente, 我们有一个带有几个控制器的HTML页面, 一个用于发送“点击事件”按钮, 接收传入消息并将其发送到websocket, 另一个监听来自新websockets客户端的传入消息(即, 其他用户发送的消息, 服务器现在希望客户端显示).

当其中一个客户端发送消息时,会发生以下情况:

  1. 浏览器通过一个JavaScript驱动程序捕获带有“发送”按钮的点击,该驱动程序收集输入字段的值(即, el texto del mensaje), 并使用连接到我们服务器的客户端发出一个websocket消息(在web页面初始化时初始化).

  2. websocket连接的服务器组件接收消息并将其转发给使用broadcast方法连接的所有其他客户端.

  3. 所有客户端通过在web页面内运行的websockets客户端组件接收消息作为插入消息. 然后他们收集信息的内容并更新网页,而不是将新信息附加到董事会上.

alt

这是最简单的例子. 对于更健壮的解决方案,您可以使用基于Redis store的简单缓存. 或者更高级的解决方案, 一个消息队列来管理消息路由到客户端,以及一个更健壮的传递机制,可以弥补临时连接损失或在断开连接时为注册客户端存储消息. 但不管你做了什么改进,Node.js仍然在相同的基本原则下运行:对事件做出反应, 管理多个同时连接, 并保持用户体验的流畅性.

DB对象顶部的API

Aunque Node.js在实时应用程序中脱颖而出, 公开DBs对象数据(p. ej. MongoDB). JSON数据存储允许Node.js工作无阻抗不等式和数据转换.

Por ejemplo, si estás utilizando Rails, 您必须将数据从JSON转换为二进制模型,然后在骨干使用数据时在HTTP上再次公开为JSON.js, angulares, etc.,甚至是普通的jQuery AJAX调用. Con Node.在js中,您可以简单地使用REST API公开JSON对象供客户端使用. Además, 当从数据库读取或写入时,您不需要担心JSON和其他任何东西之间的转换(如果您正在使用MongoDB). En conclusión, 您可以通过在整个客户端使用统一的数据序列化格式来避免执行多次转换的需要, servidor y base de datos.

Entradas en espera

如果您接收到大量并发数据,您的数据库可能会被淹没. 如上所述,Node.js可以轻松地同时处理并发连接. 但是因为对数据库的访问是一个锁定操作(在本例中), nos topamos con problemas. 解决方案是在数据写入真实数据库之前识别客户行为.

Con ese enfoque, 系统在重载下保持灵敏度, 当客户不需要对正确的数据写入进行坚定的确认时,这一点特别有用. 典型的例子包括:记录或写入用户跟踪数据, 批处理,直到以后才使用, 以及不需要立即反映的操作(如更新Facebook上的点赞计数),最终的一致性(在NoSQL世界中经常使用)是可以接受的.

数据通过某种缓存或消息队列服务器排队(例如, infraestructura, RabbitMQ, ZeroMQ),并由单独的批处理过程总结, 计算或密集处理后端服务, 为此类任务编写了更好的平台性能. 类似的行为可以用其他语言/框架实现, 但不是用相同的硬件或相同的高音, para mantener su rendimiento.

alt

En resumen: con Node, 您可以将写入的数据库推到一边,稍后再处理它, 就像这次成功一样继续下去.

Transmisión de Datos

在更传统的网络平台上, las peticiones y respuestas HTTP son tratadas como eventos aislados; de hecho, son realmente corrientes. 这个观察结果可以在Node中使用.js构建一些有趣的特性. Por ejemplo, 可以在上传文件时处理它们, 因为数据是通过一条小溪进入的, 并可以加工成时尚的线条. 这可以实时完成音频或视频编码, 作为不同数据源之间的代理(参见下一节).

PROXY

Node PROXY.js被用作代理服务器,可以在非阻塞模式下处理大量同时连接. 对于具有不同响应时间的不同服务的代理特别有用, o用于从不同来源收集数据.

例如:考虑与第三方资源通信的服务器应用程序, 从不同来源提取数据, o将图像和视频等资产存储到第三方云服务中.

尽管存在专用代理服务器, 如果代理服务器基础设施不存在,或者需要本地开发的解决方案,使用Node可能会很有用. Con esto, 我的意思是,您可以使用Node开发服务器构建客户端应用程序.js用于活动作为代理/stubbing API请求, 而在生产中,您将使用专用代理服务(nginx)处理这种交互, HAProxy, etc.).

经纪人-股票交易员仪表盘

让我们回到应用程序级别. 另一个桌面软件占主导地位的例子, sin embargo podría ser fácilmente reemplazado con una web en tiempo real es la solución comercial de los agentes de software; se utiliza para realizar el seguimiento de los precios de las existencias, 进行计算和技术分析,并创建图表和图表.

实时切换是一种基于网络的解决方案,可以让跑步者轻松地从工作站或工作场所切换. 我们很快就会在佛罗里达、伊比沙岛或巴厘岛的海滩上看到它们.

应用程序监控面板

Node-con-web-sockets完美匹配的另一个常见用例是:跟踪网站访问者并实时显示他们的交互. (如果你感兴趣,这个想法已经由colibri产生了).

你可以从你的用户那里收集实时统计数据, 或者,通过引入与访问者的选择性互动,在他们到达漏斗中的特定点时打开沟通渠道,让他们进入下一个层次. (如果你感兴趣,这个想法已经由CANDDi产生了).

Imagina cómo podría mejorar tu negocio si supieras lo que estuvieran haciendo tus visitantes en tiempo real; si pudieras visualizar sus interacciones. 使用实时,您现在可以采取两个节点路径.js.

现在是系统监控面板, 让我们从基础设施的角度来了解事物. Imagínate, por ejemplo, 希望向用户提供监控服务的SaaS提供商(例如, la página de GitHub). Con el evento Node.js-loop, 我们可以创建一个强大的基于web的仪表板,异步检查状态服务,并使用Websockets将数据发送给客户端.

(公司内部)和成员国的公共服务, 可以使用这项技术实时报道吗. 进一步推进这个想法,试着想象一个网络运营中心(NOC)在电信运营商的监控应用程序, 云/网络/托管服务提供商, 或任何金融机构, 所有运行在Node支持的open web stack上.js和Websockets代替Java和/或Java applet.

注意:不要尝试在Node中构建硬实时系统(即, 需要一致响应时间的系统). Erlang可能是这类应用程序的更好选择.

Donde node.js se puede utilizar

服务器端Web应用程序

Node.js con Express.js也可以用来在服务器上创建经典的web应用程序. 但是,只要有可能,这个请求-响应节点范例.js将携带HTML,这不是最典型的用例. 支持和反对这种方法都有理由。. 以下是一些需要考虑的事实:

Pros:

  • 如果您的应用程序没有任何CPU密集型计算, 你可以从上到下构建Javascript, 即使在数据库级别,如果您使用JSON存储对象,如MongoDB DB. 这大大促进了开发(包括招聘).

  • 爬虫得到一个完全HTML的响应, que es mucho más SEO-friendly, digamos, 单个页面或Websockets应用程序在Node上运行.js.

Cons:

  • 计算密集型CPU会阻塞节点的接受能力.js,所以线程平台是一个更好的方法. 或者,您可以尝试缩放计算[*].

  • Utilizando Node.带有关系数据库的js仍然相当痛苦(详见下文). 帮自己一个忙,选择其他环境,如Rails、Django或ASP.NET MVC,如果你试图执行关系操作.

Donde Node.js no debe usarse

在Web应用程序的服务器端,deon后面有一个DB关系

Comparando Node.js con Express.例如,js vs . Ruby on Rails,有一个决定 在访问关系数据时,明确支持后者.El DB relacional con herramientas para Node.js está aún en sus primeras etapas; es bastante prematuro y por ende 和它一起工作不太愉快. 另一方面,Rails会自动提供数据 在框的右侧设置访问权限,以及数据库模式和 支持其他宝石迁移的工具(双向). Rails y su 同源框架已经成熟并证明Active Record Data Mapper可以收集 数据访问实现,如果你试图复制它,你会错过它 JavaScript puro.[*]

然而,如果你非常倾向于一直呆在JS,保持警惕干燥 ORM和Nodo2,因为它们都还不成熟,但最终可以达到 其他编程语言.

[]这是可能的,而且并不罕见,您只使用节点作为前端,保持它的 Rails后端及其对关系数据库的简单访问.

重型服务器端/计算处理

当涉及到大量计算时,Node.js no es la mejor plataforma. Definitivamente no 您想在Node中构建一个Fibonacci计算服务器.js. 一般来说,任何操作 CPU的密集使用会抵消所有的性能优势,并阻止任何请求 entrante de un subproceso.

如前所述,Node.js是单线程的,使用单个CPU核. 当涉及到在多核服务器上添加并发性时,有一些工作 由基本节点以集群模块的形式执行[参考: http://nodejs.org/api/cluster.html]. 您还可以运行多个Node服务器实例.js 很容易通过nginx反向代理.

使用分组,您必须下载所有沉重的计算来处理一个书面的背景 在更合适的环境中,它们通过消息队列进行通信 Server como RabbitMQ.

尽管您的后台处理最初可以在同一台服务器上运行, 这种方法具有非常高的可伸缩性. 后台处理服务可以很容易地分发给独立于服务器的工作人员,而不需要配置不同web服务器的负载.

当然,您也会在其他平台上使用相同的方法,但使用Node.js:你可以得到我们所说的高需求/秒, 因为每个请求都是一个小任务,处理非常快速和有效.

Conclusión

Hemos hablado del Node.从实践理论开始,从你的目标和 野心,以甜蜜的污点和陷阱结束. Cuando las personas tienen 节点的问题,几乎总是推断出这样一个事实,即锁操作是 raíz de todo mal. 99%的节点滥用是直接后果.

Recuerda: el Node.js从来都不是为了解决计算缩放问题而创建的. 创建它是为了解决i / o伸缩问题,这做得很好.

¿Por qué usar Node.js? 如果用例不包含CPU密集型操作或 访问阻塞资源,您可以利用Node的好处.js y disfrutar de 快速和可扩展的网络应用程序. 欢迎来到实时网站.

Acerca del autor

Tomislav Capan, Croacia

Tomislav 是否有超过10年的软件工程师、技术顾问和架构师经验 de experiencia. 擅长Full-Slack,精通JavaScript和 Node.jr. 有使用c#, Java和Ruby的经验吗. 敏捷看板实践者 谁喜欢在开发项目中合作.

在这个话题上聘请一位顶级专家.
Hire Now
Tomislav Capan的简介
Tomislav Capan

Located in Zagreb, Croatia

Member since February 20, 2013

About the author

Tomislav是AWS认证的开发者 & 具有10年以上经验的解决方案架构师和技术顾问.

Toptal作者是各自领域的专家,并就其所展示经验的主题撰写文章. 我们所有的内容都由同一领域的顶级专家同行评审和验证.

Previously At

Deliveroo

世界级的文章,每周交付.

订阅意味着同意我们的 privacy policy

世界级的文章,每周交付.

订阅意味着同意我们的 privacy policy

Toptal Developers

Join the Toptal® community.