【问题标题】:Java Design questionsJava 设计问题
【发布时间】:2010-03-23 09:05:23
【问题描述】:

假设有一个系统 A 给出一些输出。该输出被系统 B 用作输入。系统 A 的生产速度快于系统 B 消耗它的速度。我们如何实现这一点?

系统 A 以 10mbps 发送视频,而系统 b 只能占用 4mbps。我们如何实现这一点。还应该有连续的视频流?通信通过套接字发生。 tcp/ip。

有人知道java中的逻辑吗?有双缓冲溶液吗?我不知道。

【问题讨论】:

  • 您是在问如何平衡 CPU 分配,以使系统 A 获得的 CPU 时间少于系统 B?或者如何存储额外的数据?或者如何让系统 B 更快……?
  • 如果 A 的生产速度快于 B 的消耗速度,那么除非您添加更多的 B,否则您肯定遇到了问题吗?如果 A 一直在生产并且只有一个 B,那么 B 将永远不会完成对 A 的输出的处理......
  • AFAIK,流式传输通常是使用 UDP 完成的,因此如果数据包到达太快就会被丢弃。这自然会降低视频的质量。在这种情况下,您不需要 TCP 的可靠性。
  • 这些答案对视频流没有任何意义。任何人都可以向我展示在 JMS 之上实现的视频流解决方案吗?或者 EAI 与视频流的关系如何?

标签: java design-patterns multithreading io


【解决方案1】:

这是称为生产者-消费者的已知问题:http://en.wikipedia.org/wiki/Producer-consumer_problem 您可以按照您的问题建议使用线程 - 您可以让系统 A 在不同的线程中运行,并且当它有意义时,您可以使该线程休眠。 其他从硬件已知的解决方案可能是使用缓冲区、中间存储器。

【讨论】:

    【解决方案2】:

    如果您学习操作系统、电信或电子产品,您会发现buffers 对此很有用。

    它们可以是一种灵活的方式来应对暂时的速度差异。如果速度差异是永久性的,并且缓冲区的大小是有限的,那么系统 A 最终将不得不暂停或冒丢失其输出的风险。

    【讨论】:

    • 感谢 john,他们正在使用高级缓冲区概念,特别是在协议中。我想知道这个概念。纯位级编程的任何人都可以帮助我。对我的职业有帮助。
    • 双缓冲对于动画来说是一个完全不同的概念:在修改另一个缓冲区时显示一个缓冲区,然后将它们交换。不要担心这个通信概念。 Java生产者消费者教程应该是一个学习的好地方:java.sun.com/docs/books/tutorial/essential/concurrency/…
    【解决方案3】:

    这取决于。如果系统 A 持续产生的输出超出系统 B 的处理能力,您有两种选择:

    • 改进系统 B 以处理系统 A 产生的负载
    • 实现一个中间系统 C,它处理来自系统 A 的输出,聚合此输出并以系统 B 可以处理的形式呈现。

    如果系统 A 产生输出的速率暂时大于系统 B 可以处理的速率,则应实施排队解决方案。系统 A 将其输出存储在队列中,系统 B 弹出队列中的项目。

    【讨论】:

      【解决方案4】:

      有两种不同的情况:

      • 系统 A 永久生成数据的速度快于 B 的处理速度
      • 系统A批量生成数据;平均超过例如一天比B能应付的还少

      第二种情况可以通过排队(JMS)来解决,第一种情况比较困难。

      如果您可以充分扩展 B 上的硬件,那将是可行的方法。

      您可以优化 B 中最慢的部分(优化代码),但您必须再次进行各种测试。

      您可以检查是否可以使用多个 B(负载平衡),但应用程序应该支持这一点(多个实例更新数据库中的相同数据并不好:)。

      这完全取决于具体的负载分布和应用程序的架构。

      【讨论】:

        【解决方案5】:

        好吧,你要么改进它,要么你让系统 B 等待系统 A 发送消息或其他任何东西.. 你可以使用线程来等待。如果你能提供更多细节,也许有人可以回答。如果您说我如何改进系统 B,您希望我们回应什么,我们对任何一个系统都一无所知。

        【讨论】:

          【解决方案6】:

          提高系统 B 的性能或降低系统 A 的性能:-)

          【讨论】:

            【解决方案7】:

            您可以使用 Java 消息服务 (JMS) 之类的解决方案。

            http://java.sun.com/products/jms/

            这允许通过消息队列进行异步通信。系统 A 和 B 完全相互独立,不必以相同的速度处理消息。

            【讨论】:

              【解决方案8】:

              太笼统的问题。我建议查看这些框架:Apache Camel, Spring Integration

              【讨论】:

                【解决方案9】:

                System A 的输出是如何提供给 System B 的?如果它们在不同的 JVM 中,您可以使用操作系统管道。比如:

                java SystemA | java SystemB
                

                当 SystemA 超前于 SystemB 时,操作系统会自动挂起。如果它们在同一个 JVM 中,使用可以使用 PipeInputStream 和 PipeOutputStream 来实现相同的事情。

                如果 SystemA 的输出不是流,那么您将不得不使用其他答案中建议的某种结构化数据方法。

                【讨论】:

                • 感谢 adrain ,但我需要管道如何知道系统 b 限制的逻辑。
                猜你喜欢
                • 2013-01-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-05-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多