我有一个可读的 NodeJS Stream,我想使用它两次。免责声明:我对流不太满意
为什么?
我的服务允许用户上传图像。我想避免上传相同的图像。
我的工作流程如下:
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
Run Code Online (Sandbox Code Playgroud)
我使用 获取流的哈希值并hashstream使用 优化我的图像gm。
Hashstream 获取一个流,关闭它,创建一个哈希并通过回调返回它。
我的问题是:结合这两种方法的最佳方法是什么?
有两种方法可以解决:
缓冲流
由于您不知道您的流是否会再次使用,因此您可以简单地以某种方式缓冲它(以某种方式意味着处理数据事件,或使用某些模块,例如accum)。一旦您知道哈希函数的结果是什么,您只需将整个累积缓冲区写入 gm 流即可。
使用stream.pipe两次来“发球”
您可能知道 posix 命令 tee,同样您可以将所有数据推送到两个地方。这是我的“scramjet”流中的tee 方法的示例实现,但我想对您来说,简单地通过管道传输两次就足够了。然后,一旦计算出哈希值并遇到第一个条件,我就会简单地发送结束消息。
正确的选择取决于您是否想节省内存或 CPU。对于更少的内存,请使用两个管道(您的优化过程将启动,但您将在它输出任何内容之前取消它)。为了减少 CPU 和进程的使用,我会选择缓冲。
总而言之,只有当您可以轻松地扩展到更多传入图像或者您确切知道有多少负载并且可以处理它时,我才会考虑缓冲。无论哪种方式都会有限制,并且需要以某种方式处理这些限制,如果您可以启动更多实例,那么您应该更好地使用更多 CPU 并将内存保持在合理的水平。
| 归档时间: |
|
| 查看次数: |
4047 次 |
| 最近记录: |