关灯
开启左侧

【转贴】哪些场合应该使用 Node.js?

[复制链接]
老蚊子 发表于 2019-5-31 08:37:19 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
在线聊天
在线聊天是最典型的实时多用户应用,也是 Node.js 的最佳案例:它是一个轻量级、高流量、数据密集型(但是低处理和计算)的应用程序,可分布式跨设备运行。它也是一个很好的学习案例,因为它很简单,但涵盖了你在典型的 Node.js 程序中所使用的大部分范例。
让我们试着描绘它是如何工作的。
假设一个最简单的场景,在我们的网站上有一个聊天室,人们可以通过一对多(实际上是对所有人)的方式交换消息。
在服务器端,我们有一个简单的 Express.js 程序,它实现了两件事:1) 一个GET 请求的处理程序,它提供了包含留言板和用于初始化新消息输入的“发送”按钮的功能,以及2) 用于侦听 websocket 客户端发出的新消息的w ebsockets 服务器。
在客户端,我们有一个 HTML 页面,其中设置了几个处理程序,一个用于“发送”按钮的单击事件,它接收输入消息并将其发送到 websocket,另一个用于侦听新的传入消息并显示在 websockets 客户端上(即服务器希望客户端显示的其他用户发送的消息)。
当其中一个客户发布消息时,会发生以下情况:
  • 浏览器捕获单击“发送”按钮事件处理 JavaScript 程序,从输入字段(即消息文本)中获取值,并使用连接到我们服务器的 websocket 客户端发出 websocket 消息(在网页初始化时初始化) 。
  • websocket 连接的服务器端组件接收消息,并使用广播方式将其转发给所有其他的客户端。
  • 所有客户端都通过在网页中运行的 websockets 客户端组件接收新消息。然后,他们通过将新消息添加页面上并更新。


这是最简单的例子。对于更强大的解决方案,你可以使用基于 Redis 的简单缓存。或者在更高级的解决方案中,可以用消息队列作为消息路由,还可以实现更强大的传递机制,例如可以在连接丢失或在客户端脱机时存储消息。但无论你做出哪些改进,Node.js 仍将按照相同的基本原则运行:对事件做出反应,处理许多并发连接,并保持用户体验的流畅性。

对象数据库顶层的 API
虽然 Node.js 的确很适合开发实时应用,但它也很适合从对象数据库(例如MongoDB)公开数据。 JSON 存储的数据允许 Node.js 在对象与存储数据一致和没有数据转换的情况下良好的运行。
例如,如果你正在使用 Rails,那么你需要从 JSON 转换为二进制模型,然后通过 HTTP 再将它们转为 JSON 在 React.js 或 Angular.js 中使用 ,甚至可以用简单的 jQuery AJAX 进行调用。使用 Node.js,你可以通过 REST API 直接公开你的 JSON 对象来供客户端使用。此外,在从数据库读取或写入时(如果你使用的是MongoDB),你无需担心在 JSON 和其他任何内容之间进行转换的问题。总之在客户端、服务器和数据库中使用统一的数据序列化格式,可以避免多次转换的麻烦。

队列输入
如果你收到了大量并发数据,那么你的数据库可能会成为瓶颈。如上所述,Node.js 可以轻松地自己处理并发连接。但是因为数据库访问是一种阻塞操作(在这种情况下),所以我们遇到了麻烦。解决方案是在数据真正写入数据库之前先确认客户端的行为。
通过这种方法,系统可以在高负载下保持其响应性,这在客户端不需要确认数据成功写入时尤其有用。典型的例子包括:记录或写入用户跟踪数据时进行分批处理;以及最终一致性(经常在NoSQL世界中使用)可以接受的不需要立即作出反映的操作(例如更新 Facebook 上的“Likes”计数)。
数据通过某种缓存或消息队列(例如,RabbitMQ,ZeroMQ)排队,并通过单独的数据库批量写入过程,或者由计算密集型后端服务进行消化,再写入更好的能够执行此类任务的平台。类似的行为可以用其他语言或框架实现,但不能在相同的硬件上实现,以维持相同的高吞吐量。


简而言之:使用 Node,你可以将数据库写先入到一个地方,稍后再去处理它们,就像它们已经被成功处理一样。

数据流
在更传统的Web平台中,HTTP 请求和响应被看作是孤立事件,实际上他们是流。可以在 Node.js 中使用这个性质来构建一些很酷的功能。例如文件可以被一边上传一边处理,因为数据通过流进入,我们可以实时的去处理它。这可以用于实时音频\视频编码,以及在不同数据源的之间进行代理(参见下一部分)。

代理
把 Node.js 用作服务器端代理是很容易的,它能够以非阻塞方式处理大量的并发连接。这对于为代理不同响应时间的多个服务,或从多个源收集数据的场景特别有用。
例如以下场景:当服务器端程序与第三方资源进行通信时,会从不同的来源提取数据,或者将图像和视频等资源存储到第三方云服务上。
尽管有专用代理服务器,但是如果你没有基础的代理架构,或者你需要本地开发环境,那么 Node 可能会对你有所帮助。

股票交易商的数据界面
让我们回到应用程序。可以很容易地用实时网络解决方案取代的另一个例子是股票经纪人的交易软件,它用于跟踪股票价格、执行计算、技术分析以及创建图表。如果切换到基于 Web 的实时解决方案,经纪人将可以轻松切换工作站或工作场所。很快,我们可能会开始在佛罗里达州的海滩上看到它们......

应用监控仪表板
另一个常见的用例,其中 Node-with-web-socket 完全适合:跟踪网站访问者并对他们的交互进行实时的可视化。你可以从用户那里实时收集统计信息,甚至可以通过在访问渠道中特定的点来打开通信渠道,并与访问者进行有针对性的互动,这种方案可以在这里找到: CANDDi
想象一下,如果你能够实时了解访问者所做的事情,你将如何改善你的业务呢?通过使用 Node.js 的实时双向套接字,现在就可以做到了。

系统监控仪表板
在基础设施方面,。比如想要为其用户提供服务监控页面的SaaS提供商(例如,GitHub状态页面)。通过 Node.js 事件循环,我们可以创建一个功能强大的基于 Web 的仪表板,以异步方式检查服务的状态,并使用 websockets 将数据推送到客户端。公司内部和公共服务的状态都可以使用该技术得到实时报告。
注意:不要尝试在 Node.js 中构建硬实时系统(即需要一致响应时间的系统)。对于那类应用程序,Erlang 可能是更好的选择


作者:前端先锋
链接:https://juejin.im/post/5cecdf606fb9a07ed7405ecd




 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


1关注

13粉丝

75帖子

排行榜
关闭

站长推荐上一条 /1 下一条

官方微信

全国服务热线:

400-0708-360

公司地址:国家西部信息安全产业基地(成都市高新区云华路333号)

邮编:610000    Email:2908503813@qq.com

Copyright   ©2015-2016  EOIT论坛Powered by©Discuz!    ( 蜀ICP备11000634号-7 )