Лучшие практики для Java IPC
-
09-06-2019 - |
Вопрос
Каков наилучший метод межпроцессного взаимодействия в многопоточном Java-приложении.
Это должно быть эффективным (так что, пожалуйста, JMS) легко реализовать и надежно, чтобы объекты и данные могли быть связаны только с одним потоком?
Любые идеи приветствуются!
Решение
Если предположить, что сценарий 1 JVM, несколько потоков, тогда действительно следует искать java.util.concurrent, особенно различные реализации очередей.Однако абстракция поверх этого может быть хороша, и там Джетланг выглядит очень интересно, легкая передача сообщений Java.
Другие советы
Не могли бы вы немного уточнить?Вы имеете в виду IPC в одной JVM?(Да, несколько потоков, но на уровне ОС только один процесс.) Или вы имеете в виду несколько JVM?(И действительно межпроцессное взаимодействие на уровне ОС.)
Если это первое, то, возможно, что-то не так java.util.concurrent, нравиться ConcurrentLinkedQueue сделал бы свое дело.(Я успешно передаю сообщение между своими потоками с классами из java.util.concurrent.)
Если позже, то я буду просто предполагать и предлагать посмотреть РМИ, хотя я не думаю, что это можно квалифицировать как полностью надежный — вам придется управлять этим немного более «практически».
Рекомендую просмотреть весь java.util.concurrent пакет, который имеет несколько классов для работы с параллелизмом и различные средства связи между потоками.Все зависит от того, чего вы хотите достичь, поскольку ваш вопрос довольно общий.
Вам следует использовать очередь производителя/потребителя.Поступая так, вы избегаете ловушек многопоточного программирования:состояния гонки и тупиковые ситуации.Кроме того, это не только проще и чище, но и намного быстрее, если вы используете очередь без блокировки, такую как Disruptor или MentaQueue.Я написал статью в блоге, где подробно рассказываю об этом и показываю, как добиться задержки <100 наносекунд: Межпоточная связь с задержкой в 2 наносекунды.
Я только что добавил MappedBus на github (http://github.com/caplogic/mappedbus), которая представляет собой эффективную библиотеку IPC, которая позволяет нескольким процессам Java/JVM взаимодействовать путем обмена сообщениями и использует для транспорта файл с отображением в памяти.Пропускная способность составила 40 миллионов сообщений в секунду.