我们正在使用Hapijs / React / Sequelize / MySQL。有一些东西让我感兴趣,我已就此事做了一些研究。
设定:
我们有React组件向Hapi API发出AJAX调用。 API返回一个对象数组。这是由React显示的。 问题: 我们从表中请求数据。该数据作为复杂对象的数组返回。每个对象都是一个sequlize对象。它还有许多我们不需要的附加属性。 我们使用HAPI回复发送该对象,类似于(40k对象):
flattenedParts.forEach(function(item) {
item.dataValues.Product = productsMap[item.dataValues.ProductId] || [];
item.dataValues.PartModule = partModulesMap[item.dataValues.PartModuleId] || [];
fullObjects.push(item);
});
reply(fullObjects).code(200);
当代码到达reply语句时,需要14秒才能将它作为简单的JSON对象数组发送。
对我而言,这些对象的序列化似乎需要很长时间。所以我想要制作一个普通对象数组,只有我需要的数据。我做了类似这样的事情(40k对象)::
flattenedParts.forEach(function(item) {
item.Product = productsMap[item.dataValues.ProductId] || [];
item.PartModule = partModulesMap[item.dataValues.PartModuleId] || [];
var flat = new partCreator(item);
newParts.push(flat);
});
reply(fullObjects).code(200);
部件创建者功能很简单:
function partCreator(part){
this.Product = {};
this.id = part.dataValues.id;
this.PartNumber = part.dataValues.PartNumber;
...
}
所以最后我得到了包含我需要的数据的简单对象的数组。速度现在大约是7秒。速度提升近50%。 但如果我是正确的,它应该快得多。 使用回复功能在幕后发生了什么,以及如何加快速度?
答案 0 :(得分:1)
当您想要返回40K(!)对象时,要利用性能没有很多事情要做。您很快就会遇到扩展问题,您无法在服务器上处理和处理内存中的这么多对象。 REST API的目的是接收请求并快速返回少量数据。您必须限制加载到内存中的数据量,并且不应超过100(甚至100都是很多)。您必须扩展您的API以支持您想要的所有功能(分页,排序,搜索等),并扩展客户端以向您的API发出更多请求。顺便说一下,一些在速度不快的设备上运行的浏览器也会出现性能问题。