Nano Hash - криптовалюты, майнинг, программирование

Как EJB может распараллелить длительный процесс с интенсивной загрузкой процессора?

Приложение имеет длительный процесс, интенсивно использующий ЦП, который в настоящее время выполняется на одном сервере (метод EJB) последовательно, когда клиент запрашивает его.

Теоретически возможно (с концептуальной точки зрения) разделить этот процесс на N частей и выполнять их параллельно, если выходные данные всех параллельных заданий могут быть собраны и объединены перед отправкой обратно клиенту, который инициировал процесс. . Я хотел бы использовать это распараллеливание для оптимизации производительности.

Как я могу реализовать это распараллеливание с помощью EJB? Я знаю, что мы не должны создавать потоки в методе EJB. Вместо этого мы должны публиковать сообщения (по одному на задание), которые будут использоваться компонентами, управляемыми сообщениями (MDB). Но тогда это уже не был бы синхронный вызов. И в этом случае синхронизация кажется обязательной, поскольку мне нужно собирать выходные данные всех заданий, прежде чем отправлять их обратно клиенту.

Есть ли решение для этого?


Ответы:


1

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

Используйте WorkManager из commonj API. Он позволяет управлять потоками в контейнере Java EE и специально разработан для вашего варианта использования. Если вы используете WebSphere или WebLogic, эти API уже доступны на вашем сервере. Для других вам придется внедрить стороннее решение в себя.

Информация WorkManager

Связанные вопросы Почему создание потоков не рекомендуется

05.01.2010
  • Кажется, что WorkManager специфичен для WebSphere, поэтому в целом не подходит: stackoverflow.com/questions/9026516/ 19.03.2012
  • Это не относится к обычному WorkManager, а к решению IBM, предшествовавшему ему. Как я уже упоминал, commonj не специфичен для IBM и доступен на большинстве платформ. 09.10.2012

  • 2

    Есть много способов сделать это.

    Во-первых, вы можете использовать таймер EJB для создания однократно запускаемого процесса, который запускается немедленно. Это хорошая техника для запуска процессов в фоновом режиме. Таймер EJB связан с конкретной реализацией сеансового компонента. Вы можете добавить таймер EJB к каждому сеансу Bean, который вы хотите сделать, или у вас может быть один сеансовый компонент, который затем может вызывать логику вашего приложения через некоторый механизм диспетчеризации.

    Для меня я передаю сериализуемый большой двоичный объект параметров вместе с именем класса, который соответствует определенному интерфейсу, в общий сеансовый компонент, который затем выполняет класс. Таким образом, я могу легко создать фон для чего угодно.

    Одно предостережение относительно таймера EJB заключается в том, что таймеры EJB являются постоянными. После создания таймера EJB он остается в контейнере до завершения или отмены его задания. Проблема в том, что если у вас есть длительный процесс, и сервер выходит из строя, при перезапуске процесс продолжится и восстановится. Помните, что это может быть хорошо, но только если ваш процесс готов к перезапуску. Но если у вас есть простой процесс, повторяющий «10 000 элементов», если сервер отключается на элементе 9 999, когда он возвращается, вы можете легко увидеть, что он просто начинается с элемента 1. Все это работоспособно, просто предостережение, чтобы знать из.

    Другой способ сделать что-то в фоновом режиме - использовать очередь JMS. Поместите сообщение в очередь, и обработчик будет синхронизирован с остальной частью вашего приложения.

    Важная часть здесь, и кое-что, что я также сделал, используя работу с Timer Bean, заключается в том, что вы можете контролировать, сколько «заданий» будет выполняться в зависимости от того, сколько экземпляров MDB вы настроите для системы.

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

    Это действительно работает на удивление хорошо. Есть небольшие накладные расходы, связанные с разделением процесса и маршрутизацией его через очередь JMS, но это все в основном «время запуска». Как только это начнется, вы получите реальную выгоду.

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

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

    Мне легко удалось настроить структуру, которая позволяет запускать задачи либо в таймере EJB, либо в очереди разброса MDB, задачи одинаковы, и я мог отслеживать их прогресс, останавливать их и т. Д.

    Вы можете комбинировать технику разброса для создания нескольких заданий таймера EJB. Одним из бесплатных преимуществ MDB является то, что он действует как пул потоков, который может ограничивать ваши задания (чтобы вы не перегружали свою систему слишком большим количеством фоновых процессов). Вы получаете это «бесплатно», просто используя функции управления EJB в контейнере.

    Наконец, в Java EE 6 есть новый «асинхронный» (или что-то в этом роде) квалификатор для методов Session Bean. Я не знаю подробностей о том, как это работает, так как я еще не играл с новым контейнером Java EE 6. Но я полагаю, что вы, вероятно, не захотите менять контейнеры только для этого объекта.

    05.01.2010

    3

    EJB - это, в конечном счете, транзакционный компонент для системы клиент-сервер, обеспечивающий семантику запроса / ответа. Если вы оказались в положении, когда вам нужно пометить длительную транзакцию в рамках цикла запроса / ответа, значит, где-то ваш системный архитектор (ure) ошибся.

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

    05.01.2010
  • Это очень черно-белый взгляд на мир, большинству из нас приходится иметь дело с оттенками серого. Вы не хотели бы перестраивать всю систему только для того, чтобы обеспечить эту функциональность. Не говоря уже о том, что нет ничего плохого в наличии синхронного вызова, который выполняет несколько параллельных операций перед возвратом, когда все они будут выполнены. Само по себе это не оправдывает архитектуру, основанную на событиях, по сравнению с простой архитектурой, основанной на запросе / ответе. 05.01.2010
  • Нет ничего плохого в том, что вы описываете в контексте структуры или платформы, которая указана и разработана с учетом таких операций. Но это не платформа JEE. Вся суть JEE заключается в принятии ограничений для продвижения распространения и доступности (а также о теперь забытой цели ориентации на компоненты). Как только вы начнете нарушать ограничения, вы фактически вступите на путь самоуничтожения. Таким образом, мы должны не соглашаться в отношении отказа от неправомерного использования технологий как от догматической точки зрения (черно-белой). 05.01.2010
  • семантика запроса / ответа ... архитектура на основе событий с серверной частью обмена сообщениями Я понимаю вашу точку зрения, если семантика запроса выполняет долгосрочный процесс, а ответ - это завершенный долгосрочный процесс. Но будет ли он соответствовать модели JEE, если запрос означает запуск долгосрочного процесса, а ответ - это длительный процесс в очереди? Затем, как следует из другого ответа, EJB может просто отправить сообщение с помощью JMS, чтобы выполнить эту работу с помощью MDB (или даже потребителя сообщения, не являющегося JEE). 19.03.2012
  • Отсутствие поддержки длительных процессов - это давний пробел в архитектуре JEE (который не решался MDB), но, честно говоря, мне не ясно, как можно согласовать прозрачное распределение, COA и требуемые SLA с такими элементы. В целом JEE решает эту проблему с помощью архитектуры коннектора, и, предположительно, вы предоставите механизм выполнения транзакций (EIS), который обрабатывает длительные процессы и т. Д. 19.03.2012

  • 4

    Назад в будущее - Java EE 7 имеет гораздо больше поддержки параллелизма через ManagedThreadFactory, службу ManagedExecutor и т. Д. (JSR 236: Утилиты параллелизма для Java EE), с помощью которых вы можете создавать свои собственные 'управляемые' потоки. Это больше не табу в EE AS поддерживая его (Wildfly?), используя API ManagedThread *

    Подробнее

    https://jcp.org/aboutJava/communityprocess/ec-public/materials/2013-01-1516/JSR236-EC-F2F-Jan2013.pdf http://docs.oracle.com/javaee/7/tutorial/doc/concurrency-utilities002.htm

    04.04.2014
  • В конце концов, когда мне нужно было работать с JBoss AS 7.1 и я столкнулся с задачей параллельного выполнения без потоков, я автоматически последовал архитектуре на основе сообщений, содержащей главную задачу, разделенную на подзадачи; использование кластеров Jboss и HorneQ и балансировки нагрузки; выложил в GitHub фреймворк 18.11.2014
  • JBoss AS 7.1 уже реализует спецификацию EJB 3.1. Вы можете использовать вызов асинхронного метода для простых случаев использования. Не забудьте настроить пул потоков на сервере приложений в соответствии со своими потребностями. 08.10.2015

  • 5

    Однажды я участвовал в проекте, в котором транзакции EJB выполнялись до 5 часов за раз. Аааааааааааааааааааа!

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

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

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

    05.01.2010
  • Не рекомендуется, категорически запрещено: stackoverflow.com/a/9739300/545127 19.03.2012

  • 6

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

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

    Я работал над проектом с аналогичными требованиями и решил создать дополнительные потоки (тогда это противоречило sepc). Операция для распараллеливания была доступна только для чтения, поэтому она работала в отношении транзакции (поток в основном не имел связанной транзакции с ними). Я также знал, что не буду порождать слишком много потоков на вызовы EJB, поэтому количество потоков не было проблемой. Но если предполагается, что ваши потоки изменяют данные, вы серьезно нарушите транзакционную модель EJB. Но если вы работаете с чистыми вычислениями, это может быть нормально.

    Надеюсь, поможет...

    05.01.2010
  • Найдите WorkManager в CommonJ API. Это позволяет делать это в управляемых потоках. 05.01.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..