【问题标题】:How to scale up in Java如何在 Java 中进行扩展
【发布时间】:2023-03-24 21:33:01
【问题描述】:

我有 100 多个视频流频道要同时处理。我需要捕捉视频,生成缩略图,并将它们作为 Web 服务提供。对于缩略图的生成,我可以使用 JMF 等。(我注意到还有一篇关于如何生成和访问的帖子:better quality thumbnails from larger image files)。但我担心的是:如何扩展? Java EE EJB 还是简单的 Java SE 线程?有什么缺点和优点?如何使用 EJB 进行水平扩展?

我对可扩展性问题不太熟悉,非常感谢您提出的建议。

谢谢。

【问题讨论】:

  • 可扩展性没有单一的答案,也没有简单的方法来“实施”它。这有点像问“我如何强制我设计一个好的程序”?
  • 那我怎样才能把标题放在更合适的地方呢?我不是这方面的专家,感谢您的建议。

标签: java video-processing


【解决方案1】:

同意...线程应该有助于在单台机器上扩展。如果您想在不同的机器上进行扩展,请使用 Terracotta。

【讨论】:

    【解决方案2】:

    Java SE 线程可以帮助您在单台机器上扩展,但如果您需要在不同机器上水平扩展,EJB 将是一种方法。

    如果是我,我可能会将其外包到一个单独的 Web 服务层,该层可以根据需要在任意多的机器上运行,然后在这些机器之间进行负载平衡。

    【讨论】:

    • Williams,您能否详细解释一下“将其移植到单独的 Web 服务层”,谢谢。
    • 找出在单个线程中工作的最小工作单元。围绕该工作单元创建一个 Web 服务。该服务可以在许多不同的机器上并行运行,并且前面会有一个负载均衡器来平均分配工作。在此之前,您的主要 Web 服务将负责将工作拆分为单任务子单元,并通过负载均衡器将这些单元转发到单任务服务上。它会收集结果,并将它们发送回请求的客户端。
    【解决方案3】:

    我看不出在这种情况下使用 EJB 的理由。你必须问自己瓶颈在哪里。我的赌注是视频处理。我会分析您的应用程序并查看在等待时间片的时间多于处理时间之前可以处理多少线程。在某个点之后添加更多线程不会增加更多吞吐量。到那时,您就知道一台机器会做什么以及需要多少台机器才能维持一定的吞吐量。如何跨机器扩展是另一个问题。

    【讨论】:

    • 这是一个非常好的观点!在购买硬件之前做一些实验似乎是更好的解决方案。
    【解决方案4】:

    这是两个截然不同的问题。

    捕获/处理听起来像是渲染农场的问题。这些都是水平缩放的。大多数解决方案都涉及作业队列,您甚至不需要在 Java 中执行此操作;只需找到您喜欢的简单解决方案即可。 “render farm ffmpeg”或类似的东西应该会在 Google 中产生结果。

    您的“作为 Web 服务提供”部分有些未定义。如果您希望这些视频可以访问,您可能只需将它们放在 HTTP 服务器上 - 这些可以轻松进行负载平衡,因此可以水平扩展 - 存储速度或网络带宽可能是您的第一个瓶颈。

    【讨论】:

      【解决方案5】:

      放弃正式的 J2EE 堆栈。

      相反,一个很好的消息队列,它与作为消费者运行 Y 个线程的 X 个 JVM 对话 JMS。

      【讨论】:

        猜你喜欢
        • 2018-05-05
        • 2019-10-30
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        • 2019-07-16
        • 1970-01-01
        • 2012-03-07
        • 1970-01-01
        相关资源
        最近更新 更多