【问题标题】:How to use a NodeJS Stream twice?如何使用 NodeJS Stream 两次?
【发布时间】:2016-06-03 08:54:00
【问题描述】:

我有一个可读的 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 获取一个流,关闭它,创建一个哈希并通过回调返回它。

我的问题是:结合这两种方法的最佳方法是什么?

【问题讨论】:

标签: node.js stream


【解决方案1】:

有两种方法可以解决:

  • 缓冲流

    由于您不知道您的流是否会被再次使用,您可以简单地以某种方式对其进行缓冲(不知何故意味着处理数据事件或使用某些模块,例如 例如accum)。一旦您知道哈希函数的结果,您只需将整个累积缓冲区写入 gm 流。

  • 使用 stream.pipe 两次“tee”

    您可能知道 posix 命令 tee,同样您可以将所有数据推送到两个位置。这是我的“超燃冲压发动机”流中的一个示例implementation of a tee method,但我想对你来说,只需管道两次就足够了。然后,一旦您计算出哈希并遇到第一个条件,我就会简单地发送结束。

正确的选择取决于您是要节省内存还是 CPU。为了减少内存,请使用两个管道(您的优化过程将开始,但您将在它输出任何内容之前取消它)。为了更少的 CPU 和更少的进程使用,我会去缓冲。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2019-06-09
    • 2013-09-14
    相关资源
    最近更新 更多