Когда выбрать несколько процессов над потоками в Java? - PullRequest
8 голосов
/ 18 февраля 2012

По каким причинам для реализации приложения на Java можно выбрать несколько процессов из нескольких потоков?

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

Я лично думаю, что это должно быть сделано с использованием потоков, а не процессов, но какие аргументы будут защищать оригинальный дизайн?

Ответы [ 2 ]

9 голосов
/ 18 февраля 2012

Я (и другие, см. Атрибуцию ниже) может подумать о нескольких причинах:

Исторические причины

  • Дизайн взят из дней, когдабыли доступны только зеленые нити, и оригинальный автор / дизайнер полагал, что они не будут работать для него.

Надежность и отказоустойчивость

  • Вы используете компоненты, которые не являются потокобезопасными, поэтому вы не можете распараллелить их, прибегая к нескольким процессам.

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

  • Исправить многопоточность все еще сложно.В зависимости от вашего дизайна сложнее, чем многопроцессорная.Однако позднее это, возможно, также не слишком просто.

  • У вас может быть модель, в которой имеется сторожевой процесс, который может активно отслеживать (и в конечном итоге перезапускать) сбойные рабочие процессы.Это может также включать приостановку / возобновление процессов, что небезопасно для потоков (спасибо @ Jayan за указание).

Ограничения ресурсов ОС& Governance

  • Если процесс, использующий один поток, уже использует все доступное адресное пространство (например, для 32-разрядных приложений в Windows 2 ГБ), вам может потребоваться распространитьработа между процессами.

  • Ограничение использования ресурсов (ЦП, памяти и т. д.) обычно возможно только для каждого процесса (например, в Windows вы можете создавать объекты "задания")(требуется отдельный процесс).

Соображения безопасности

  • Вы можете запускать разные процессы, используя разные учетные записи (например, «пользователи»).), обеспечивая тем самым лучшую изоляцию между ними.

Проблемы совместимости

  • Поддержка нескольких / разных версий Java: используя разные процессы, вы можете использовать разные Javaверсии для вашегочасти приложения (если это требуется сторонними библиотеками).

Прозрачность местоположения

  • Вы можете (потенциально) распределить свое приложение по нескольким физическим машинам,таким образом, дальнейшее повышение масштабируемости и / или устойчивости приложения (см. @ Qwe's answer для получения дополнительной информации / исходной идеи).
6 голосов
/ 18 февраля 2012

Если вы решите использовать потоки, вы ограничите запуск своего приложения на одной машине.Это решение не масштабируется (или масштабируется до некоторой степени) - аппаратные ограничения всегда есть.

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

Решение, какой подход является более подходящим, само по себе является очень интересной задачей.И как только вы примете решение, нет гарантии, что оно будет выглядеть глупо для ваших преемников через пару лет, когда изменятся требования или появится новое оборудование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...