使用Hapijs处理和发送大量数据

时间:2016-10-19 11:05:48

标签: javascript node.js hapijs

我们正在使用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%。 但如果我是正确的,它应该快得多。 使用回复功能在幕后发生了什么,以及如何加快速度?

1 个答案:

答案 0 :(得分:1)

当您想要返回40K(!)对象时,要利用性能没有很多事情要做。您很快就会遇到扩展问题,您无法在服务器上处理和处理内存中的这么多对象。 REST API的目的是接收请求并快速返回少量数据。您必须限制加载到内存中的数据量,并且不应超过100(甚至100都是很多)。您必须扩展您的API以支持您想要的所有功能(分页,排序,搜索等),并扩展客户端以向您的API发出更多请求。顺便说一下,一些在速度不快的设备上运行的浏览器也会出现性能问题。