性能文章>一次冗余配置传递引发的OOM>

一次冗余配置传递引发的OOM转载

2年前
371524
 

介绍

最小代码复制

'使用严格';常量控制器 = 要求('鸡蛋')。控制器;const DEFAULT_OPTIONS = { 记录器:控制台 };类 SomeClient {
构造函数(选项) {
this.options = 选项;
}
async fetchSomething() {
return this.options.key;
}
}
常量客户 = {};function getClient(options) {
if (!clients[options.key]) {
clients[options.key] = new SomeClient(Object.assign({}, DEFAULT_OPTIONS, options));
}
返回客户端[options.key];
}
类 MemoryController 扩展控制器 {
async index() {
const { ctx } = this;
const options = { ctx, key: Math.random().toString(16).slice(2) };
常量数据 = 等待 getClient(options).fetchSomething();
ctx.body = 数据;
}
}
module.exports = 内存控制器;
router.post('/memory', controller.memory.index);
'使用严格';常量 fs = 要求('fs'); 
常量 http = 要求('http');
const postData = JSON.stringify({
// 一个比较大的字符串(大约 2 MB)可以放在 body.txt
数据中: fs.readFileSync('./body.txt').toString()
});
function post() {
const req = http.request({
method: 'POST',
host: 'localhost',
port: '7001',
path: '/memory',
headers: {
'Content-Type': 'application/ json',
'内容长度': Buffer.byteLength(postData)
}
});
req.write(postData); req.end(); req.on('error', function (err) {
console.log(12333, err);
});
}
设置间隔(发布,1000);

故障排除

function getClient(options) { 
if (!clients[options.key]) {
clients[options.key] = new SomeClient(Object.assign({}, DEFAULT_OPTIONS, options));
}
返回客户端[options.key];
}

代码修复和确认

函数 getClient(options) { 
const someClientOptions = Object.assign({ key: options.key }, DEFAULT_OPTIONS);
if (!clients[options.key]) {
clients[options.key] = new SomeClient(someClientOptions);
}
返回客户端[options.key];
}

结论

点赞收藏
嘉俊
请先登录,查看2条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步
4
2