龙空技术网

5个技巧让你的 NodeJS 服务性能大幅度提升

杨同学编程 264

前言:

今天小伙伴们对“nodejs安装出错”大致比较珍视,咱们都想要剖析一些“nodejs安装出错”的相关知识。那么小编也在网络上汇集了一些对于“nodejs安装出错””的相关文章,希望同学们能喜欢,小伙伴们快快来学习一下吧!

Node.js 是著名的事件驱动 I/O 服务器端 JavaScript 环境和基于V8 引擎(谷歌开源高性能 JavaScript 引擎)的单线程事件循环。Node.js 的事件驱动架构对于实时应用程序,尤其是聊天应用程序和流式应用程序来说是非常好的技术。由于客户端和服务器端都是用JavaScript编写的,单线程设计的同步过程更好更快。

在 Node.js 上具有良好的生产力,实际上您还希望 Node.js 可以更优化。在本文中,我们将讨论 5 种让 Node.js 在工作中更快、更优化的方法。

1. 用 Redis 缓存你的应用

什么是缓存? 在缓存过程中,Redis 作为一个更复杂的 Memcached 版本。Redis 始终在服务器的主内存中提供和修改数据。影响是系统将快速检索所需的数据。

它还可以减少打开网页的时间并使您的网站更快。Redis 通过创建出色的内存缓存来减少访问延迟,从而帮助和提高关系数据库或 NoSQL 的负载性能。

使用 Redis 我们可以使用 存储缓存SET and GET,此外 Redis 还可以处理复杂类型的数据,例如Lists, Sets,ordered data structures等等。

我们将对 Node.js 中的 2 段代码进行比较。以下是当我们尝试从 Google Book API 检索数据时,没有将 Redis 放在端点上。

没有 Redis 的 Node.js:

现在,我们将在此端点上放置一个 Redis。如果您在使用 Redis 时遇到问题,可以在此处阅读 Node.js 上 Redis 的完整文档。

带有 Redis 的 Node.js:

可以看到,上面的代码说明Redis会使用我们指定的唯一键值来存储缓存数据,使用这个函数:

client.setex (isbn, 3600, JSON.stringify(book));

并使用以下函数获取缓存数据:

client.get(isbn, (err, result) => {      if (result) {        res.send (result);      } else {        getBook (req, res);      }    });

这是两个代码的测试结果。如果我们不使用 Redis 作为缓存,至少需要908.545 ms

没有 Redis 的响应时间

非常不同,当 Node.js 使用 Redis 时。看这个,速度非常快,在同一个端点检索数据只需要0.621 ms :

Redis 的响应时间

2.确保您的查询已优化

基本上,数据库在查询中生成的过程对性能影响很大。

当端点生成系统调用的数据时。一个不好的查询,会使显示数据的过程变得很慢。

例如,如果我们在 MongoDB 上有一个数据,问题是当我们有 400 万行数据时,要找到 1 个所需的数据关键字,而不使用索引模式,这将使查询过程非常缓慢。

使用 MongoDB,我们可以分析查询过程是如何工作的。您可以添加此查询:explain(“executionStats”)来分析和查找集合中的用户数据。

> db.user.find({email: 'ofan@skyshi.com'}).explain("executionStats")

看这个,在我们创建索引之前,在查找数据的时候响应查询。

> db.user.find({email:'arguc.mert@gmail.com'}).explain("executionStats") { "queryPlanner" : ...   },   "winningPlan" : {    "stage" : "COLLSCAN" ,   “过滤器”:{     “电子邮件”:{      “$eq”:“ rguc.mert@gmail.com ”     }    },   “方向”:“转发”   },  “rejectedPlans”:[] },“executionStats”: {   “executionSuccess”:真,  “nReturned”:1,  “executionTimeMillis”:0,  “totalKeysExamined”:0,  “totalDocsExamined" : 1039,   "executionStages" : {    ...        },    ...   } },“服务器信息”:{   ... },“确定”:1 } >

从上面的 JSON 结果中,我们可以分析出两个重要的点,即:

nReturned: 显示 1 表示查询匹配并返回 1 个文档。totalDocsExamined: MongoDB 已扫描1039 个文档数据(此搜索所有文档),得到 1 个所需数据。

这是我们尝试将索引电子邮件添加到用户集合的时候。

> db.getCollection("user").createIndex({ "email": 1 }, { "name": "email_1", "unique": true }) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, " numIndexesAfter" : 2, "ok" : 1 }

添加索引邮件后查询分析结果:

> db.user.find({email: ' a rguc.mert@gmail.com'}).explain("executionStats") { "queryPlanner" : ...,   "winningPlan" : {    "stage" : "FETCH" ,   “inputStage”:{     “stage”:“IXSCAN”,    “keyPattern”:{      “email”:1     },    “indexName”:“email_1”,    “isMultiKey”:false,    “isUnique”:true,    ...    }   },  “rejectedPlans”:[] },“executionStats”:{   “executionSuccess”:true,  “nReturned”:1,  “executionTimeMillis”:0,  “totalKeysExamined”:1,  “totalDocsExamined”:1,  ...    }  } }, "服务器信息" : {   ... }

您可以看到,在totalDocsExamined点,MongoDB只搜索 1 个相关数据,这将使查询过程更加快速和高效。这是将索引添加到 MongoDB 时的优势。通过添加索引,当您想要对集合中的数据进行排序时,它也很有用。

3. 使用日志记录检查所有错误脚本

为什么日志记录很重要?首先是您必须确保您的应用程序运行正常,没有任何致命错误。如果在任何时候,您在程序中发现了一些奇怪的东西,那么是时候找出是什么代码导致了错误。通过日志记录,您可以跟踪活动和 API 进程流量。

人们经常使用的日志记录过程是默认使用console.log('Log Output'),它会在输出标准(stdout)上插入一些日志,console.error('Log Error')也会进入错误标准(标准错误)。但是,我建议您使用更流行和更高效的日志记录模块,例如Winston、Morgan和Buyan。

我将举例说明我们如何使用 Winston 进行日志记录。一般来说,Winston 有 4 个自定义级别可供我们使用,例如:error、warn、info、verbose、debug和silly。

可以在 Winston 上使用的一些功能:

可以使用相同类型的多个传输简单分析支持日志查询可以捕获并记录 uncaughtException设置日志消息的级别

首先,我们需要安装 Winston 并将 Winston 包含在新项目或您开发的项目中。运行以下命令来执行此操作:

npm install winston --save

这是我们使用的基本配置 Winston:

常量温斯顿 = 要求(“温斯顿”);让记录器=新温斯顿.记录器({运输:[新的winston.transsports.File({级别:'详细',时间戳:新日期(),文件名:'filelog-verbose.log',json: 假的,}),新的winston.transsports.File({级别:'错误',时间戳:新日期(),文件名:'filelog-error.log',json: 假的,})]});logger.stream = {写:函数(消息,编码){logger.info(消息);}};

从上面的代码我们知道,我们确实使用了多个传输配置,有 2 个级别的日志记录,即详细和错误。

4. 实现 HTTP/2

HTTP/2 通常称为 SPDY,是 IETF HTTP 工作组开发的最新 Web 协议标准。HTTP/2 使网页浏览更快、更轻松、带宽使用率更低。它侧重于性能,尤其是解决 HTTP/1.x 以前版本中仍然存在的问题。目前,您可以看到一些流行的网站,如 google、facebook 和 youtube,已经在其网页上实现了 HTTP/2 协议。

为什么这比 HTTP/1.x 更好?

多路复用:

多路复用将允许多个请求和响应消息同时在单个 TCP 连接中检索资源。标头压缩:

通过 HTTP 的每个请求都包含标头信息。在 HTTP/1.1 中,许多标头在一个会话中重复并重复相同的信息。这种开销是相当大的,HTTP/2 删除了多余的标头,同时按下了剩余的标头并强制所有 HTTP 标头以压缩格式发送。服务器推送:

对于 HTTP/1.1,它必须等待客户端发送连接。服务器推送允许服务器通过“推送”它声称客户端需要缓存它的响应来避免发送数据的延迟,并自动通过减少请求数量来加快页面加载时间。二进制格式:

HTTP/1.1 以文本格式发送数据,而 HTTP/2 以二进制格式发送数据。与以前版本的文本协议相比,二进制协议更有效地解析和减少错误数量。

我们知道,Node.js 目前支持并提供核心 Node.js 的 HTTP/2 实现。该 API 与标准 node.js HTTPS API非常相似。从 HTTP/2 开始,您可以使用以下代码行在 Node.js 上创建 HTTP/2 服务器:

实现基于 OpenSSL 的传输层安全 (TLS) 和安全套接字层 (SSL) 协议。您可以通过此处创建自签名 SSL 证书来生成server.key和。server.crt

由于 HTTP/2 支持仍处于试验阶段,因此必须使用--expose-http2命令行启动 Node.js:

$节点--expose-http2节点-http2.js

现在是时候检查一个网站是否使用了最新的 HTTP/2 协议。

使用 Node.js 的 HTTP2

从上图中,您将能够识别出该网站一直在使用 HTTP/2 协议。

5. 集群你的 Node.js

默认情况下,Node.js 在处理器单核上的单线程上运行。它不使用系统中可能可用的多个内核。但是现在,使用 Node.js 上的集群,它允许您轻松创建所有共享服务器端口的子进程。这意味着集群可以处理多核系统的大量请求。并且自动地,这将提高您的服务器的性能。

Node.js 集群模块

Node.js 实现了核心集群模块,允许应用程序在多个核心上运行。集群模块,父/主进程可以在任意数量的子/工作进程中分叉,并通过IPC通信与它们通信并发送消息。让我们看看下面的一个小代码片段:

当节点运行时,似乎有 4 个工作人员当前在 Node.js 上使用一个集群。

Node.js 集群

现在您可以http:localhost:3000/cluster在不同的选项卡和浏览器上访问该链接,您会发现每个选项卡都有不同的工作人员 ID。

使用 PM2 进行 Node.js 集群

PM2 是具有内置负载均衡器的 Node.js 应用程序的生产流程管理器。它允许您使应用程序永远保持活动状态,在不停机的情况下重新加载它们,并促进常见的系统管理任务。它的一个更好的特性是自动使用 Node 的Cluster API。PM2 使您的应用程序能够作为多个进程运行,而无需任何代码修改。例如,下面是一个使用 express 构建的简单代码:

使用下面的命令,PM2 将自动生成与 CPU 内核数量一样多的工作人员。让我们开始并执行以下命令以使用 PM2 启用集群:

pm2 启动 app.js -i 0

现在您可以看到 PM2 集群如何在所有可用 CPU 上进行扩展

总的来说,PM2 集群是强大的工具,可以真正提高 Node.js 的并发性和整体性能。这比在 Node.js Core 上使用现有集群模块要容易。

标签: #nodejs安装出错