你是一个踏入后端开发领域的前端爱好者吗?🤔 准备好迎接在Node.js错综复杂的景观中惊险刺激的旅程吧!🎢
在这个探险中,我们将探索后端的无数奇迹,从使用Node.js框架快速创建自己的后端,到应对性能分析、测试,深入内存管理。💻🔍
加入我们,揭开C++插件的奥秘,征服子进程,掌握多线程艺术,利用Cluster模块的力量,以及平滑管理进程守护进程。 🚀💡
是时候提升你的Node.js技能并征服后端宇宙了!🌌 你准备好迎接这个挑战了吗?让我们开始吧!🚀👩💻👨💻
使用Express构建你的第一个HTTP服务器
好的,系紧安全带,开始一个令人兴奋的旅程,进入构建基本服务的世界!🎢💻 为了开始,我们卷起袖子使用Express实现一个简单的HTTP服务器。🚀🚂
const fs =require('fs')const express =require('express')const app =express()
app.get('/',(req, res)=>{
res.end('hello world')})
app.get('/index',(req, res)=>{const file = fs.readFileSync(__dirname +'/index.html','utf-8')/* 返回缓冲 */
res.end(file)/* 返回流 */// fs.createReadStream(__dirname + '/index.html').pipe(res) })
app.listen(3000)
通常,我们的后端服务共同返回一系列接口信息。但是,为了进行某些后续测试,我们选择返回一个文件。这种选择使我们可以更直观地评估我们的服务性能并识别潜在的瓶颈,特别是在更大的数据集上。
📄 此外,在注释流中,你可以观察到我们也使用一种形式来返回信息。在返回文件时,初始的同步读取过程往往比较耗时。对于更大的文件,整个内容被存储在内存中,然后一次性返回。当涉及到内存使用时,此性能问题尤其明显。
性能测试和压力测试
为了评估我们的系统在高并发下的健壮性,我们将利用专门用于压力测试的测试工具。我推荐考虑两种可靠的工具:
- ab (Apache Benchmark)
- webbench
- autocannon
为了我们的目的,让我们关注 ab 进行下一步操作。Apache Benchmark,即 ab,是一个来自 Apache 软件基金会的工具。如果你使用的是 macOS,那么你很幸运,因为这个工具已经包含在内。 对于其他系统,你可以在网上找到安装教程。
⚠️ 请记住,macOS 自带的 ab 工具具有并发性限制。
现在,让我们深入一个简单的命令并分解关键参数:
ab -n <total_requests> -c <concurrent_requests> <url>
- -n:在测试期间执行的请求总数。
- -c: 一次要执行的多个请求数。
例子:
ab -n 1000 -c 10 http://your-api-endpoint
此命令启动一个压力测试,总共1000个请求,同时模拟10个并发请求。
Node.js性能分析工具
profile
Node.js内置了一个强大的分析工具。要使用它,只需在启动Node.js应用程序时添加 — prof :
node - prof index.js
启动服务器后,名为 isolate-0x104a0a000–25750-v8.log 的文件会立即在目录中生成。最初,你可以忽略该文件。 现在,让我们进行为期15秒的压力测试:
ab -c 50 -t 15 http://127.0.0.1:3000/index
完成压力测试后,我们的日志文件将发生更改。但是,里面的数据非常庞大,需要解析。
为了使数据更易访问,我们可以使用 Node.js自带的以下命令:
node - prof-process isolate-0x104a0a000–25750-v8.log > profile.txt
此命令将生成的日志文件转换为更可读的 txt 格式,并存储在当前目录中。尽管这种文本格式更直观,但它可能仍然有点不方便。 内容包括调用次数、占用的时间、JavaScript、C++ 的各种调用栈信息、垃圾回收等。你可以手动探索详细信息。
如果文本格式不符合你的需求,还有另一种更方便的分析方法!📊
Chrome DevTools
鉴于 Node.js 是由 Chrome V8 引擎提供动力的,我们可以有效地利用 Chrome DevTools 来调试 Node.js。 要启动调试并同时暂停程序,我们将使用新的参数 *
— inspect-brk
*:
node - inspect-brk index.js
运行此命令后,你会看到一条消息,指示调试器正在侦听 WebSocket,比如 *
ws://127.0.0.1:9229/e9f0d9b5-cdfd-45f1–9d0e-d77dfbf6e765
。*
对于调试,打开 Chrome 浏览器,在地址栏中导航至 *
chrome://inspect
*。
🔍 在这里,你会发现可用于检查的可用目标列表。 找到你的 Node.js 应用程序,点击 “inspect,”,瞧! 你现在可以使用强大的 Chrome DevTools 来调试 Node.js 应用程序了。
欲了解更多指南,你可以参考官方 Node.js 文档:Node.js Inspector。
代码性能优化
在分析性能瓶颈后,很明显文件读取操作
readFileSync
消耗了最多的时间。进一步检查原始代码发现,每次访问 *
/index
- 路径都会触发对文件的再次读取。这成为一个明确的优化机会。
让我们做一个小的修改来提高性能:
const fs =require('fs')const express =require('express')const app =express()
app.get('/',(req, res)=>{
res.end('hello world')})/* 当提取到外部时,每个程序只会读取它一次来提高性能 */const file = fs.readFileSync(__dirname +'/index.html','utf-8')
app.get('/index',(req, res)=>{/* 返回缓冲 */
res.end(file)/* 返回流 */// fs.createReadStream(__dirname + '/index.html').pipe(res) })
app.listen(3000)
在我们的变革性分析和压力测试之后,结果证明——通过采用异步操作优化文件读取可以使你的QPS (每秒查询数)翻一番。这种简单的代码修改证明了高效的编码实践的重要影响。
版权归原作者 今天也想MK代码 所有, 如有侵权,请联系我们删除。