如何在NodeJS中重复使用流?

5

我有一个可读的NodeJS流,我想要使用两次。免责声明:我对流不太熟悉。

为什么?

我的服务允许用户上传图像。我想避免上传相同的图像。

我的工作流程如下:

upload image per ajax
get hash of image
if hash in database
  return url from database
else
  pass hash to resize&optimize pipeline
  upload image to s3 bucket
  get hash of image and write it to database with url
  return s3 url

我使用hashstream获取我的流的哈希值,并使用gm优化我的图像。

Hashstream接受一个流,关闭它,创建哈希值并通过回调返回。

我的问题是:如何结合这两种方法以达到最佳效果?


这个问题也很有用:https://dev59.com/IVoU5IYBdhLWcg3w5p2a - Cymen
1个回答

4
有两种解决方法:
  • 缓冲流

    由于你不知道你的流是否会被再次使用,因此可以简单地将其缓冲起来(某种意义上是处理数据事件,或者使用一些模块,例如accum)。只要你知道哈希函数的结果,就可以将整个累积的缓冲区写入gm流。

  • 使用stream.pipe两次进行“tee”操作

    你可能知道posix命令tee,同样地,你可以将所有数据推送到两个位置。这里有一个实现“scramjet”流中的tee方法的示例,但我想对你来说只需简单地使用两个pipe即可。然后,一旦计算出哈希值并满足第一个条件,我会简单地发送一个end。

正确的选择取决于您想要保留内存还是CPU。如果要使用更少的内存,请使用两个管道(优化过程将开始,但在输出任何内容之前将其取消)。如果要使用更少的CPU和进程,则应使用缓冲。

总而言之,只有在您可以轻松扩展到更多的传入图像或者您确切地知道有多少负载并且可以处理它时,才应考虑缓冲。无论如何,都会有限制,这些限制需要以某种方式处理,如果您可以启动更多实例,则使用更多CPU并将内存保持在合理水平可能更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接