2010-03-23 95 views
2

假设有一个系统A给出了一些输出。该输出被系统B用作输入。系统A产生的速率比系统B消耗它的速率更快。我们如何实现这一点?Java设计问题

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

有人知道java中的逻辑吗?有一个双缓冲解决方案?我不知道。

+1

他们,改进什么? – Bozho 2010-03-23 09:07:38

+0

您是否在问如何平衡CPU分配,以便系统A比系统B获得更少的CPU时间?或者如何存储额外的数据?或者如何让系统B更快......? – Steve 2010-03-23 09:09:23

+0

如果A产生的速度比B消耗的速度快,那么除非你增加更多的B,否则你的手中有问题?如果A不断地生产并且只有一个B,那么B将永远不会完成处理A的输出.... – Joel 2010-03-23 09:34:41

回答

1

如果你学习操作系统,电信或电子学,你会发现buffers对此很有帮助。

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

+0

感谢约翰,他们正在使用先进的缓冲概念,特别是在protocols.i想知道这个概念。任何来自纯位编程的人都可以帮助我。有助于我的职业生涯。 – 2010-03-23 10:07:25

+0

双缓冲对动画来说是一个完全不同的概念:在修改另一个缓冲区时显示一个缓冲区,然后交换它们。不要担心通信的这个概念。 Java生产者消费者教程应该是一个学习的好地方:http://java.sun.com/docs/books/tutorial/essential/concurrency/guardmeth.html – John 2010-03-23 11:30:58

0

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

5

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

1

这取决于。如果系统A连续不断地产生更多的输出比B系统可以处理,你有两种选择:

  • 提高系统B来处理负载系统A产生
  • 实现处理来自系统A输出的中介系统C,汇总此输出并以系统B可以处理的形式呈现它。

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

0

您可以使用像Java消息服务(JMS)这样的解决方案。

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

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

1

有2个不同的情况:

  • 系统A永久地生成数据的速度比可以通过乙
  • 系统A分批产生数据进行处理;通过例如平均一天它少于B可以处理

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

如果您可以充分扩展B上的硬件,那么这将是一条路。

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

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

这一切都取决于具体的负载分布和应用程序的体系结构。

0

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

java SystemA | java SystemB 

当系统在SystemB之前太远时,操作系统将自动挂起SystemA。如果它们在同一个JVM中,可以使用PipeInputStream和PipeOutputStream来实现同样的目的。

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

+0

谢谢adrain,但我需要管道知道系统b的限制。 – 2010-03-23 10:00:26