首页 > 解决方案 > 如何跟踪 node.js 请求的状态?

问题描述

我有一个生成图像的 node.js 应用程序,我们会说“图像 A”,然后使用“图像 A”生成另一个图像,我们将称为“组合 A”。如果节点服务器大约在同一时间收到 4 个对合成 A、合成 B、合成 C 等的图像请求,所有这些都需要图像 A(完全相同的图像)。目前,在这种情况下,服务器正在重新生成“图像 A”4 次,导致图像请求时间非常低效。

我试图找出只生成一次“图像 A”的最有效方法,并将其用于大约同时进入的后续 4 个图像请求。我遇到的问题是服务器请求是分开的。

我的计划是尝试设置类似“对于图像组合 B 的服务器请求 #2,等待服务器请求 #1 图像 A 完成,然后使用该图像而不是重新生成它。我不确定如何具体在继续处理后续请求之前,使用节点事件系统检查第一个请求是否已完成。

当前设置的说明:

前端:

<img src="compositionA" />
<img src="compositionB" />
<img src="compositionC" />
<img src="compositionD" /> 

服务器:

请求 #1:生成图像 A --> 生成合成 A(使用图像 A)

请求 #2:生成图像 A --> 生成合成 B(使用图像 A)

请求 #3:生成图像 A --> 生成合成 C(使用图像 A)

请求 #4:生成图像 A --> 生成构图 D(使用图像 A)

标签: node.js

解决方案


如果Image A所有请求的标识符都相同,为什么不在Composition ImageURL 中将标识符作为查询参数传递,如下所示:

<img src="compositionA?generatedImageId=<image-id>" />
<img src="compositionB?generatedImageId=<image-id>" />
<img src="compositionC?generatedImageId=<image-id>" />
<img src="compositionD?generatedImageId=<image-id>" /> 

如果identifier在应用程序中是唯一的,则可以在服务器上实现 LRU 缓存。我不会进入代码级别的细节。但是,我将概述一个可能的解决方案。

  1. 维护缓存
  2. 第一次调用请求,查看缓存。
  3. 什么都不会存在,因为缓存是空的。
  4. 在这种情况下,进行计算并缓存映射到标识符的结果。
  5. 后续调用将使用先前计算的值。

在这种情况下,由于调用同时发生并且计算是异步的,Promise因此需要缓存 a of 计算。这样,在第一次调用时,promise 可以立即被缓存。然后后续调用将等待该承诺。一旦第一次调用的承诺得到解决,剩下的请求就会立即得到处理。

缓存的管理(生命周期、到期等)是一个需要单独处理的问题。可以为该用例找到不同的库。您可以根据需要配置它们。


推荐阅读