Вопросы Java-дизайна - PullRequest
       16

Вопросы Java-дизайна

2 голосов
/ 23 марта 2010

Предположим, есть система A, которая дает некоторый выход. Эти выходные данные используются в качестве входных данных системой B. Скорость, с которой система A производит, быстрее, чем скорость, с которой система B потребляет его. Как мы можем это реализовать?

Система A отправляет видео со скоростью 10 Мбит / с, где система b может принимать только 4 Мбит / с. Как мы можем реализовать это. Также должна быть непрерывная потоковая передача видео? общение происходит через сокет. TCP / IP.

Кто-нибудь знает логику в Java? есть двойной буферный раствор? я не знаю.

Ответы [ 9 ]

5 голосов
/ 23 марта 2010

Это известная проблема, называемая Producer-Consumer: http://en.wikipedia.org/wiki/Producer-consumer_problem Вы можете использовать потоки, как подсказывает вопрос, - вы можете запустить систему A в другом потоке, и, когда это имеет смысл, вы можете заставить этот поток спать.Другое решение, известное из аппаратного обеспечения, могло бы использовать буфер, промежуточную память.

1 голос
/ 23 марта 2010

Существует два различных случая:

  • Система A постоянно генерирует данные быстрее, чем может быть обработана B
  • Система A создает данные в пакетах;усреднено, например, за день, который меньше, чем B может обработать

Второй случай может быть решен с помощью очередей (JMS), первый случай более сложный.достаточно увеличить аппаратное обеспечение на B, чем это могло бы быть.

Вы можете оптимизировать самую медленную часть B (оптимизировать код), но вам придется снова проводить все виды тестирования.

Вы можете проверить, можете ли вы работать с несколькими B (балансировка нагрузки), но приложение должно это поддерживать (несколько экземпляров, обновляющих одни и те же данные в БД, не годятся:).

Все этозависит от конкретного распределения нагрузки и архитектуры приложений.

1 голос
/ 23 марта 2010

Если вы изучите операционные системы, телекоммуникации или электронику, вы поймете, что буферы хороши для этого.

Они могут быть гибким способом справиться с временными различиями в скорости. Если разница в скорости постоянна и буфер имеет конечный размер, то системе A в конечном итоге придется приостановить работу или рискнуть потерять свой вывод.

1 голос
/ 23 марта 2010

Это зависит.Если система A непрерывно производит больше выходных данных, чем может обрабатывать система B, у вас есть два варианта:

  • Улучшение системы B для обработки нагрузки. Система A производит
  • Реализация промежуточной системы C, которая обрабатываетвыходные данные из системы A агрегируют эти выходные данные и представляют их в форме, которую может обрабатывать система B.

Если скорость, с которой система A производит выходные данные, временно превышает скорость, с которой система B можетсправиться с этим, вы должны реализовать решение для очередей.Система A сохраняет свои выходные данные в очереди, а система B выводит элементы очереди.

0 голосов
/ 23 марта 2010

Как выходные данные системы A передаются в систему B? Если они находятся в разных JVM, вы можете использовать канал операционной системы. Что-то вроде:

java SystemA | java SystemB

ОС автоматически приостанавливает работу SystemA, когда она слишком сильно опережает SystemB. Если они находятся в одной и той же JVM, можно использовать PipeInputStream и PipeOutputStream для достижения того же результата.

Если выходные данные SystemA не являются потоком, вам придется использовать некоторый подход структурированных данных, как предлагается в других ответах.

0 голосов
/ 23 марта 2010

Слишком общий вопрос. Предлагаю рассмотреть эти фреймворки: Apache Camel , Spring Integration

0 голосов
/ 23 марта 2010

Вы можете использовать такое решение, как Java Messaging Service (JMS).

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

Это позволяет асинхронную связь через очереди сообщений. Система A и B полностью независимы друг от друга и не должны обрабатывать сообщения с одинаковой скоростью.

0 голосов
/ 23 марта 2010

Улучшение производительности системы B или снижение производительности системы A: -)

0 голосов
/ 23 марта 2010

Ну, вы либо улучшаете его, либо нет, или у вас есть система B, ожидающая, пока система A отправит сообщение, или что-то еще .. вы можете использовать потоки для этого для ожидания.Может быть, если бы вы могли предоставить более подробную информацию, кто-то сможет ответить.Если вы скажете, как я могу улучшить систему B, что вы хотите, чтобы мы отреагировали, мы ничего не знаем ни об этой системе.

...