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

Process and send large amount of data using Hapijs

我们正在使用 Hapijs/React/Sequelize/MySQL。有个问题让我很困惑,我研究了一下。

设置:

我们有向 Hapi API 发出 AJAX 调用的 React 组件。 API returns 一组对象。这是由 React 显示的。 问题: 我们从 table 请求数据。该数据作为复杂对象的数组返回。这些对象中的每一个都是一个 sequlize 对象。而且它还有很多我们不需要的附加属性。 我们使用 HAPI 回复发送该对象,例如 (40k objects):

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);

当代码到达回复语句时,需要 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);

part creator功能很简单:

function partCreator(part){
  this.Product = {};
  this.id = part.dataValues.id;
  this.PartNumber = part.dataValues.PartNumber;
  ... 
  }

所以最后我得到了包含我需要的数据的简单对象的数组。现在的速度大约是 7 秒。速度提高近 50%。 但如果我是正确的,它应该快得多。 reply 函数在幕后发生了什么,我怎样才能加快它的速度?

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