在我的NodeJS中,有一个庞大的处理任务,包括从IBM下载大约600 my的音频文件(大约70 my的8到10音频),然后使用FFMPEG https://www.npmjs.com/package/ffmpeg处理这些音频文件。音频处理大约需要5分钟的时间。此过程是异步的,因此我的前端将响应。
如何处理同一个音频处理的多个请求,但问题是多个请求将有不同的音频要下载和处理,因此在处理多个请求时可能会出现争用情况。通过阅读其他堆栈溢出答案,我了解了创建子进程或工作线程之类的方法。什么将是适当的方法,我的用例,我如何确保种族条件是不满足的?
发布于 2020-05-19 06:43:51
从ffmpeg模块的文档中我们可以看到以下内容:
这个库提供了一组函数和实用程序来抽象命令行使用ffmpeg。
我查看了ffmpeg模块的源代码,发现实现的核心如下:
utils.exec([ffmpeg.bin,'-formats','2>&1'], settings, ...
utils.exec
基本上是这样的:
child_process.exec(finalCommand, settings, ...
因此,基本上,ffmpeg模块已经在使用子进程来执行CPU密集型任务。这意味着node.js没有执行任何CPU密集型任务。
这意味着您不需要做任何额外的来处理多个请求。您所做的任何其他事情都将只是使用更多的RAM,而不会带来任何性能上的好处。
如何扩大规模:
缩放在任何语言中都是一样的,因为您的服务器本质上已经是多线程/多处理。只需使用一个拥有更多核心的CPU。
扩展到CPU之外:
像Netflix和YouTube这样的大型服务可以并行处理成千上万的媒体。显然,你不能购买一个拥有数万个核心的CPU。如何扩展是在多个CPU/服务器之间负载平衡您的服务,而不是直接使用ffmpeg:
┌─────────────────┐ ┌─────────────────────┐
│ node web server │ --------> │ node ffmpeg servers │┐
└─────────────────┘ └┬────────────────────┘│┐
└┬────────────────────┘│
└─────────────────────┘
发布于 2020-05-19 06:14:05
背景
我也有过类似的经历,但那是视频转换和处理。我不得不使用ffmpeg
将视频转换成不同的容器和质量格式。
解决方案
这是最好的方法,因为我的场景是创建一个作业队列。我使用了celery
,它能够很好地处理它。
您的用例的等效值是- https://github.com/mher/node-celery。
您必须生成一些工作人员,以便从像RabbitMQ
这样的消息队列数据库中分配任务。任务完成后,他们异步地发送一个响应。希望这适用于您的场景。
https://stackoverflow.com/questions/61883891
复制相似问题