我想要使用两次可读的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
我使用hashstream
获取了我的信息流的哈希值,并使用gm
优化了我的图片。
Hashstream获取流,关闭它,创建一个哈希并通过回调返回它。
我的问题是:结合两种方法的最佳方法是什么?
答案 0 :(得分:2)
有两种方法可以解决它:
缓冲流
由于您不知道您的流是否会再次使用,您可以简单地以某种方式缓冲它(某种程度上意味着处理数据事件,或者使用某些模块, 例如accum)。一旦你知道哈希函数的结果,你只需将整个累积的缓冲区写入gm流。
使用stream.pipe两次“tee”
您可能知道posix命令tee,同样可以将所有数据推送到两个位置。这是我的“scramjet”流中的一个示例implementation of a tee method,但我猜你只需要管道两次就足够了。然后,只要您计算出哈希并运行到第一个条件,我就会发送一个结束。
正确的选择取决于您是否要节省内存或CPU。对于较少的内存使用两个管道(您的优化过程将启动,但您将在它输出任何内容之前取消它)。对于较少的CPU和较少的进程使用,我会去缓冲。
总而言之,只有当您可以轻松扩展到更多传入图像或者您确切知道有多少负载并且您可以处理它时,我才会考虑缓冲。无论哪种方式都会有限制,这些限制需要以某种方式处理,如果你可以开始更多的实例,那么你应该更好地使用更多的CPU并将内存保持在合理的水平。