加装涡轮,提速Nodejs Expressjs

加装涡轮,提速Nodejs Expressjs

涡轮增压器 保养不便宜,还是自然吸气好了~

26 回复

好的,我们可以将这个比喻转换为如何优化 Node.js 和 Express.js 的性能。以下是具体的内容:


加装涡轮,提速Node.js Express.js

涡轮增压器确实可以提升引擎的性能,但维护成本也高。同样地,在Node.js和Express.js中,也有许多方法可以提高应用的性能,而这些方法通常不需要太复杂的配置或额外的成本。

1. 使用HTTP缓存

HTTP缓存是一种非常有效的方法来减轻服务器的负担。通过设置合适的缓存策略,可以让浏览器在一定时间内直接从本地缓存中获取资源,而不是每次都请求服务器。

const express = require('express');
const app = express();

app.use((req, res, next) => {
    res.setHeader('Cache-Control', 'public, max-age=31536000'); // 缓存一年
    next();
});

app.get('/', (req, res) => {
    res.send('<h1>Hello World!</h1>');
});

app.listen(3000, () => console.log('Server running on port 3000'));

2. 使用反向代理

使用Nginx作为反向代理服务器可以显著提高应用的性能和安全性。Nginx可以处理静态文件、负载均衡、SSL终止等任务,从而减少Node.js应用的负担。

http {
    upstream myapp {
        server 127.0.0.1:3000;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp;
        }
    }
}

3. 使用CDN(内容分发网络)

CDN可以将静态资源分布在全球各地的服务器上,这样用户可以从最近的节点获取资源,从而减少延迟。

// 示例代码中无法直接展示CDN配置,但可以在HTML中引用CDN中的资源
<link rel="stylesheet" href="https://cdn.example.com/styles.css">

4. 优化数据库查询

对于涉及数据库的操作,可以通过索引、缓存查询结果等方式来提高性能。

// 使用Redis缓存查询结果
const redis = require('redis');
const client = redis.createClient();

app.get('/data', async (req, res) => {
    const key = 'some-data-key';
    let data = await client.get(key);
    
    if (!data) {
        data = await fetchDataFromDB(); // 假设这是一个从数据库获取数据的函数
        client.setex(key, 3600, JSON.stringify(data)); // 设置缓存,有效期为1小时
    }
    
    res.json(JSON.parse(data));
});

通过以上这些方法,我们可以有效地提升Node.js和Express.js应用的性能,就像给汽车加装涡轮一样,让应用跑得更快更稳。


希望这些示例和解释对你有所帮助!


不申请添加到 express 官方wiki 当中?

看样子是快不少,但是后期维护麻烦,还不知道未知的bug~ express 性能够可以了。。

有时间看看原理,感兴趣!

有时间看一下原理。先收藏一下。

hoho~,我也喜欢自然吸气的线性加速,和高转速

等完善下功能再review几次代码再提交吧~谢谢啊

express性能是够用了,不过这2个模块就像涡轮,可以更进一步压榨它的性能

我发现社区没有表情系统 [good]

nice 期待啊,刚出的时候,看了数据就觉得很有前途,跟connect配合。

iroute与express的测试对比其实是不公平,前者的路由匹配只是简单的字符串对比(strncmp),后者则是正则式匹配。express以损失部分性能为代价,换来高度自由化的路由匹配和参数转换。如果express同样做字符串对比的简单路由匹配,可预计两者的性能是差不多的。

ifile建议再多做个流量测试。express在流量10M~100M下表现良好,至于ifile,呃,要求node v0.10+,我的vps装不了。居然不支持0.8这个超级稳定版本…0.10因为引入新的stream api,bug满天飞。说白了就是拿公众做测试肉鸡的版本,坐等0.12。

静态文件输出与nginx怎么样?

哈哈,又是你这位犀利哥,我比较喜欢你的评论,一针见血

iroute和express的路由机制不同,只要达到相同的目的,我想就算实现方式不同还是有一定可比性的,同样iroute也有请求method判断,参数是否存在的判断,多个middle ware过滤功能,只是express多了一个将参数的数值放在了路由里去判断了,但是为了这个功能损失的性能是不是有点得不偿失。

你说的流量测试是指带宽测试吧,测试在10Mbps和100Mbps下的表现吧。ifile其实目前有一个比较大的问题就是对于大size文件的响应,ifile会将整个文件全部读入内存然后再响应,如果文件过大,可能会造成内存crash,所以下个版本大文件还是要走nodejs的pipe,毕竟大文件的响应性能主要不是靠i/o的速度了,是靠带宽了。

至于0.8版本的node我想我们还是应该向前看,其实程序本身是应该支持0.8的,只是我在package.json中的支持写上了0.10.x,毕竟0.10版本也是官方推出的stable版本,0.8版本早晚成为历史的,而且在api上两者还是有变化的,想要全部兼容还得费点力。

http://cnodejs.org/topic/51c3289573c638f370492f2e中有说明,相同的机器,相同的文件,相同的网络环境之间的测试结果

厉害,感觉iroute和ifile更加适合跟connect配合使用,选择使用express的同学估计不会考虑这些性能损耗

哈哈,感谢捧场啊~团队组建好了吗?

额,应该可以和connect整合把,没测试过

应该可以和connect一起使用吧,api差不多的。所以说你考虑的东西比较实际和实用,我都是弄些花哨的玩意,大都只能算储备没机会投入生产,唉~

使用时稍微复杂,如果能像简单地引入一个中间件就可以的,就方便多了。 比如这样: app.use(iroute()) 或者 iroute(app)

我擦,有道理啊,我怎么没想到呢,不过这2个模块是给我们新框架flat用的,你不也在这个群里么,还有小问

对不起我无意泼冷水。我提的问题是假如ndoejs 的缓存真的不是那么理想,为什么不使用反向代理,代替这部分工作。

哈哈,我就喜欢泼冷水的,听其他声音 1、nodejs缓存不理想是你打错字了吧,你是说静态文件响应不理想吧,静态文件建议公司生产环境还是用nginx或者cdn上去,但是个人网站什么的可能是nodejs空间,没有条件安装nginx的话还是只能使用nodejs来处理静态文件

2、反向代理主要工作是负载均衡,但是随之而带来的性能损耗也要计算在里面,反向代理应该使用在更适合的地方,单服务器我觉得没必要

这个代码看起来不是那么友好

在这个帖子中,“加装涡轮,提速Node.js Express.js”实际上是在探讨如何优化和加速使用Express.js构建的Node.js应用。这里可以理解为如何通过一些技术和方法来提高Express应用的性能。

1. 使用HTTP缓存

你可以通过设置适当的HTTP头来利用客户端浏览器和中间件的缓存机制。例如:

app.use(express.static('public', {
    maxAge: 86400000 // 设置缓存时间为一天
}));

2. 使用Gzip压缩

启用Gzip压缩可以减少传输数据的大小,从而加快响应时间。

const compression = require('compression');
app.use(compression());

3. 使用更高效的模板引擎

某些模板引擎比其他模板引擎更快。例如,pugejshandlebars 更快。

app.set('view engine', 'pug');

4. 数据库查询优化

确保数据库查询高效且只获取所需的数据。使用索引、预编译查询以及避免N+1查询问题。

5. 路由优化

确保路由定义尽可能高效,避免不必要的中间件。

app.get('/api/data', (req, res) => {
    // 仅返回所需数据
    db.query('SELECT * FROM users WHERE id = ?', [req.query.id], (err, results) => {
        if (err) return res.status(500).send(err);
        res.json(results);
    });
});

6. 使用集群模式

在多核服务器上使用Node.js集群可以提高处理能力。

const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
} else {
    app.listen(3000, () => console.log(`Worker listening on port 3000`));
}

这些方法可以帮助你显著提高Express应用的性能。每个项目可能需要不同的优化策略,因此请根据具体情况进行调整。

回到顶部