2010-03-23 3 views
2

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

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

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

+1

em, улучшите что? – Bozho

+0

Вы спрашиваете, как сбалансировать выделение процессора так, чтобы система А получала меньше процессорного времени, чем система B? Или как хранить дополнительные данные? Или как сделать систему B быстрее ...? – Steve

+0

Если A производит быстрее, чем B потребляет, то если вы не добавите больше B, то у вас проблемы с вашими руками? Если A постоянно производит и с одним B, B никогда не закончит обработку выхода A .... – Joel

ответ

1

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

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

+0

благодаря john, они используют расширенную концепцию буфера, в частности, в протоколах. Я хочу знать концепцию этого. может кто-нибудь из чистого программирования уровня бит помочь мне. полезно для моей карьеры. –

+0

Двойная буферизация - совершенно другая концепция анимации: отобразите один буфер, а вы измените другой, а затем поменяйте их. Не беспокойтесь об этой концепции для общения. Учебник для потребителей Java-производителей должен быть хорошим местом для изучения: http://java.sun.com/docs/books/tutorial/essential/concurrency/guardmeth.html – John

0

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

0

Повышение производительности системы B или уменьшая систему производительности :-)

5

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

1

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

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

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

0

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

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

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

1

Есть 2 различных случая:

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

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

Если вы можете увеличить аппаратное обеспечение на B достаточно, то это будет путь.

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

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

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

0

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

java SystemA | java SystemB 

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

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

+0

спасибо adrain, но мне нужна логика того, как труба знает ограничение системы b. –

Смежные вопросы