我有一个拥有40,000名在线用户的安卓游戏。每个用户每5秒向服务器发送一次请求。
我为测试请求编写了这段代码:
const express = require('express')
const app = express()
const pg = require('pg')
const conString = 'postgres://postgres:123456@localhost/dbtest'
app.get('/', function (req, res, next) {
pg.connect(conString, function (err, client, done) {
if (err) {
return next(err)
}
client.query('SELECT name, age FROM users limit 1;', [], function (err, result) {
done()
if (err) {
return next(err)
}
res.json(result.rows)
})
})
})
app.listen(3000)
为了测试这段代码有40,000个请求我写这个ajax代码:
for (var i = 0; i < 40000; i++) {
var j = 1;
$.ajax({
url: "http://85.185.161.139:3001/",
success: function(reponse) {
var d = new Date();
console.log(j++, d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds());
}
});
}
问题:
此代码(节点js)每秒只响应200个请求!
如何改善我的代码以提高每秒的响应次数?
这种方式(ajax)模拟40,000名在线用户是否正确?
如果我使用socket是否更好?
答案 0 :(得分:2)
您应该使用Divide&Conquer算法来解决此类问题。找到资源效率最低的操作,并尝试替换或减少对它的调用量。
我在这里看到的主要问题是服务器在每个请求上打开与数据库的新连接,这可能需要大部分时间和资源。
我建议在服务器启动时打开连接,并在请求中重复使用它。
const express = require('express')
const app = express()
const pg = require('pg')
const conString = 'postgres://postgres:123456@localhost/dbtest'
const pgClient
pg.connect(conString, function (err, client, done) {
if (err) {
throw err
}
pgClient = client
})
app.get('/', function (req, res, next) {
pgClient.query('SELECT name, age FROM users limit 1;', [], function (err, result) {
if (err) {
return next(err)
}
res.json(result.rows)
})
})
app.listen(3000)
为了进行适当的压力负载测试,最好使用Apache等ab等专用工具。最后,套接字更适合快速,小数据传输,但请记住它存在扩展问题,并且在大多数情况下,在10K +同时连接时变得非常低效。
编辑:正如@robertklep指出的那样,在这种情况下更好地使用client pooling,并从池中检索客户端。