node.js - 如何跟踪 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)
解决方案
如果Image A
所有请求的标识符都相同,为什么不在Composition Image
URL 中将标识符作为查询参数传递,如下所示:
<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 缓存。我不会进入代码级别的细节。但是,我将概述一个可能的解决方案。
- 维护缓存
- 第一次调用请求,查看缓存。
- 什么都不会存在,因为缓存是空的。
- 在这种情况下,进行计算并缓存映射到标识符的结果。
- 后续调用将使用先前计算的值。
在这种情况下,由于调用同时发生并且计算是异步的,Promise
因此需要缓存 a of 计算。这样,在第一次调用时,promise 可以立即被缓存。然后后续调用将等待该承诺。一旦第一次调用的承诺得到解决,剩下的请求就会立即得到处理。
缓存的管理(生命周期、到期等)是一个需要单独处理的问题。可以为该用例找到不同的库。您可以根据需要配置它们。
推荐阅读
- python - virtualenv 中的 pip 版本错误
- javascript - 如何像参数一样在数组中使用 .map() 数组?
- go - 如何模拟另一个包中的函数?
- r - 使用来自 openssl 的 rsa_decrypt 解密 R 中的密钥时出错
- vb.net - VB.Net 暂停 Windows 关机或注销
- excel - 将 ZipCode 记录范围拆分为单独的单元格
- xaml - 如何预填充自动完成 SelectedItem
- python - 如何通过多个行索引删除 numpy 数组的行?
- android - 如何将传感器数据获取到信标广告数据中?
- reactjs - 在 React 中,每次我刷新页面时,Firebase auth 用户都是空的