【问题标题】:How I Can Run Some Part of the Code on another EC2 instance我如何在另一个 EC2 实例上运行部分代码
【发布时间】:2021-07-26 17:33:24
【问题描述】:

我有一个在 EC2 实例上运行的 NodeJS 应用程序,它具有一些用户可以录制多个视频的功能。

当用户注销时,我使用(版本 4.2.4) 将所有这些视频组合成一个视频。

我正在录制WEBM格式的视频,最终的单个视频应该是MP4格式。

假设用户录制了 3 个视频,每个视频 10 分钟,那么最后当用户退出时,这 3 个视频应该合并为一个长度为 30 分钟的视频。

现在一切正常,但是当所有对话和连接都在进行时,CPU 使用率很高。

CPU 使用率有时高达60-70%

我所遵循的过程是

  1. webm 文件转换为mp4 文件。

    ffmpeg -i input_file.webm -c:v copy -c:a copy output_file.mp4
    
  2. 将 MP4 转换为 ts(Transport Stream) 文件。

     ffmpeg -i output_file.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts OUTPUT_MP4.ts
    

    我正在按照这个过程将所有 mp4 文件合并为一个。

  3. 连接文件

    ffmpeg -i "concat:OUTPUT_MP4_1.ts|OUTPUT_MP4_2.ts|OUTPUT_MP4_3.ts" -c copy -bsf:a aac_adtstoasc FINAL_MP4_SINGLE_FILE.mp4
    

所有这些过程都很耗时(但不是优先级),但是,这个过程占用了很多 CPU。

如果我的应用程序上有很多用户,并且可能正在进行视频转换,服务器可能会崩溃或变慢。

现在,我的问题是我如何在 dedicated EC2 instance 上运行此转换过程,在第一个 EC2 上运行的相同代码中,只能进行转换而不能进行任何其他工作实例。

【问题讨论】:

  • AWS 销售elastic transcoding 服务,可以满足您的需求。它有一个基于队列的 API。
  • @O.Jones 感谢您的快速响应,但问题是用户可以拥有视频,只要用户愿意,elastic transcoding 可能相当昂贵。

标签: ffmpeg javascript node.js video amazon-ec2 ffmpeg


【解决方案1】:

您将需要一个后处理任务的工作队列。一个简单的 Javascript 数组可以用作队列:您 .push() 将新项目放入队列,然后 .shift() 将它们取出以使用它们。

你需要一个循环函数来消费队列,看起来像这样。

async function convertVideo (queue, completed) {
  while (true) {
    if (queue.length === 0) {
      await sleep(1000)
      continue
    }
    const item = queue.shift()
    await convertItem(item)
    completed.add(item)
  }
}
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

此函数将一次在一个项目上运行您的convertItem() 函数。在程序启动时调用此函数一次。给它排队。 我已经投了一个Set 来保存已完成的项目。

const queue = []
const completed = new Set()
convertVideo(queue, completed).next()

您可能希望以不同的方式处理完成。

这不会在不同的虚拟机上运行转换。但它确实可以防止您的单个实例过载。

您可以通过以下方式添加容量:

  • 为您的 VM 添加内核,并运行 convertVideo 函数两次以获得两个并发转换操作。
  • 添加具有相同服务器软件的新虚拟机并对传入请求进行负载平衡。

如果您必须在不同的 VM 上运行转换,则需要某种 VM 间排队方案,以便您的 Web 服务器机器可以将工作项传递给转换机器。 Amazon SQSredisRabbitMQ 是虚拟机间排队技术的可能选择。还有其他的。如果不深入了解您的应用的工作方式,很难给出详细的建议。

如果您使用单独的虚拟机进行处理,您会发现 AWS 弹性转码服务已经解决了有关排队的所有操作细节。它很昂贵,但 24x7 运行多核 EC2 实例也是如此。

【讨论】:

  • 我现在只是有一个疑问,如何将此进程移动到另一个 EC2 实例?我的意思是假设当用户按下注销时,我运行上面你说的代码,这存在于我的第一个 EC2 中,我希望所有转换都应该发生在第二个 EC2 实例上,如问题中所述EC2 实例将无法处理负载。
  • 谢谢,我会尝试这些选项,让我看看哪个最适合我。
  • 我尝试了为后处理任务提供并实现队列的方法。
猜你喜欢
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2019-06-10
  • 1970-01-01
  • 2017-09-20
  • 2014-05-11
  • 2013-05-09
相关资源
最近更新 更多