一文搞懂:使用throng运行express应用

简介: 一文搞懂:使用throng运行express应用

"

参考了heroku的一个demo,同时集成了perf

环境准备

package.json

{

""name"": ""nodejs-throng"",

""version"": ""1.0.0""//代码效果参考:https://v.youku.com/v_show/id_XNjQwMDQxMTM4NA==.html

,

""main"": ""index.js"",

""license"": ""MIT"",

""dependencies"": {

""crypto"": ""^1.0.1"",

""express"": ""^4.17.1"",

""throng"": ""^5.0.0""

}

}

app.js

const throng = require('throng')

const WORKERS = process.env.WEB_CONCURRENCY || 2

const PORT = process.env.PORT || 8080

?

throng(WORKERS, start)

?

function start(workid) {

console.log('Starting:',workid)

const crypto = require('crypto')

const express = require('express')

const app = express()

?

app

.get('/cpu', cpuBound)

.get('/memory', memoryBound)

.get('/io', ioBound)

.get('/', hello)

.listen(PORT, onListen)

?

function hello(req, res, next) {

console.log('workid:',workid)

res.send('Hello, world')

}

?

function cpuBound(req, res, next) {

console.log('workid:',workid)

const key = Math.random() < 0.5 ? 'ninjaturtles' : 'powerrangers'

const hmac = crypto.createHmac('sha512WithRSAEncryption', key)

const date = Date.now() + ''

hmac.setEncoding('base64')

hmac.end(date, () => res.send('A //代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg1NDMyMA==.html

hashed date for you! ' + hmac.read()))

}

?

function memoryBound(req, res, next) {

console.log('workid:',workid)

const large = Buffer.alloc(10 1024 1024, 'X')

setTimeout(() => {

const len = large.length // close over the Buffer for 1s to try to foil V8's optimizations and bloat memory

console.log(len)

}, 1000).unref()

res.send('Allocated 10 MB buffer')

}

?

function ioBound(req, res, next) {

console.log('workid:',workid)

setTimeout(function SimulateDb() {

res.send('Got response from fake db!')

}, 300).unref()

}

?

function onListen() {

console.log('Listening on', PORT)

}

}

perf

perf record -e cycles:u -g -- node --perf-basic-prof --perf-prof-unwinding-info app.js

火焰图

可以使用flamescope

运行的多进程效果

说明

最好的对比就是通过不同模式的对比火焰图

参考资料


"
image.png
相关文章
|
开发工具 git
如何运行github上面的node+express项目
如何运行github上面的node+express项目
256 0
88 # express 应用和路由的分离
88 # express 应用和路由的分离
52 0
87 # express 应用和创建应用的分离
87 # express 应用和创建应用的分离
32 0
|
4月前
|
存储 缓存 JavaScript
构建高效后端服务:Node.js与Express框架的实战应用
【8月更文挑战第2天】在数字化时代的浪潮中,后端服务的构建成为了软件开发的核心。本文将深入探讨如何利用Node.js和Express框架搭建一个高效、可扩展的后端服务。我们将通过实际代码示例,展示从零开始创建一个RESTful API的全过程,包括路由设置、中间件使用以及数据库连接等关键步骤。此外,文章还将触及性能优化和安全性考量,旨在为读者提供一套完整的后端开发解决方案。让我们一同走进Node.js和Express的世界,探索它们如何助力现代Web应用的开发。
|
4月前
|
JSON JavaScript 中间件
深入浅出Node.js后端开发之Express框架应用
【8月更文挑战第29天】本文将带领读者快速了解并掌握使用Express框架进行Node.js后端开发的基础和进阶知识。我们将一起探索Express的安装、基本使用方法,并通过实际代码示例学习如何搭建一个简单的Web服务器。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
4月前
|
JavaScript 前端开发 Linux
【Azure 应用服务】NodeJS Express + MSAL 实现API应用Token认证(AAD OAuth2 idToken)的认证实验 -- passport.authenticate()
【Azure 应用服务】NodeJS Express + MSAL 实现API应用Token认证(AAD OAuth2 idToken)的认证实验 -- passport.authenticate()
|
4月前
|
JavaScript 安全 Linux
【Azure 应用服务】NodeJS Express + MSAL 应用实现AAD登录并获取AccessToken -- cca.acquireTokenByCode(tokenRequest)
【Azure 应用服务】NodeJS Express + MSAL 应用实现AAD登录并获取AccessToken -- cca.acquireTokenByCode(tokenRequest)
|
4月前
|
JavaScript Linux API
【Azure 应用服务】NodeJS Express + MSAL 应用实现AAD集成登录并部署在App Service Linux环境中的实现步骤
【Azure 应用服务】NodeJS Express + MSAL 应用实现AAD集成登录并部署在App Service Linux环境中的实现步骤
|
4月前
|
网络安全 C++
【Azure Developer】Visual Studio 2019中如何修改.Net Core应用通过IIS Express Host的应用端口(SSL/非SSL)
【Azure Developer】Visual Studio 2019中如何修改.Net Core应用通过IIS Express Host的应用端口(SSL/非SSL)
|
5月前
|
存储 中间件 API
Node中的AsyncLocalStorage 使用问题之CLS工作的问题如何解决
Node中的AsyncLocalStorage 使用问题之CLS工作的问题如何解决