Squeak.ru - шаблоны программирования

Отделите веб-службы от других серверных служб тяжелых вычислений на Java.

Предыстория веб-приложения:

Я использую java/spring-mvc/tomcat для предоставления своего веб-сервиса, а также для предоставления моего спокойного API мобильным клиентам. Я доволен всем на веб-поверхности прямо сейчас. Проблема в том, что в основе моего приложения лежит очень тяжелый вычислительный процесс, который вызывает отдельную программу на Java для обработки изображений и возврата вычисленных данных обратно в веб-службу. Иногда он занимает много памяти моего экземпляра EC2 или вызывает исключение, которое отключает мой сервер Tomcat7.

Вопрос:

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

Какие существуют варианты, которые позволяют мне разделить их и улучшить масштабируемость и стабильность?

Обновлять:

Я могу вызывать вычислительный движок программно или из командной строки.

Обновление2:

Я провел некоторые исследования, основанные на ответе. Когда я прочитал в другом сообщении о Что такое Apache Camel?, я почувствовал, что должен вероятно, узнать немного больше о шаблонах EIP. Надеюсь, это не перебор.

Решение на основе предложения

Прочитав концепцию EIP, верблюд в действии, activemq, я, наконец, нашел решение. Это может быть не элегантно, но это работает. Предложения и комментарии будут оценены! Я написал маршрутизатор очереди на основе apache-camel, подключившись к брокеру activemq и работая как отдельная программа на одном сервере. Вычислительный движок работает в автономном контейнере, а маршрутизатор отвечает за обработку запросчика jms из моего контейнера spring на веб-сервере. Позже мне просто нужно настроить баланс нагрузки для вычислительного движка от верблюда, если потребуются дальнейшие интенсивные вычисления.


  • Гипотеза, может быть? Гипноз — это нечто другое. 29.08.2012
  • @ryo можете ли вы кэшировать изображения и вычислять их, когда сервер не загружается? 29.08.2012
  • @Евгений, спасибо за предложение. Да, я могу это сделать. Тем не менее, у меня все еще есть проблема со стабильностью, когда-то запуск вычислительной программы приводил к падению кота. Если есть способ отделить его, я могу просто создать исключение для основного сервера, а основной сервер изменить запрос на другой вычислительный сервер. 29.08.2012

Ответы:


1

Тот, который указывает прямо сейчас, добавляет больше оборудования. Вам нужно подумать, решит ли это вашу проблему. Например: если вы используете 32-битную JVM, существуют ограничения на размер кучи, который вы можете указать. Если вам повезло иметь 64-битную JVM, у вас будет больше места для памяти. Но всегда есть вероятность использования слишком большого количества ЦП, когда ваше приложение перестанет отвечать на запросы.

Я предпочитаю разбивать ресурсоемкие задачи на задания и выполнять их на отдельной JVM. Сохраняйте свои задания в хранилище данных/JMS, чтобы они не потерялись. Будьте осторожны, если вы выполняете обновления БД из этих заданий, чтобы избежать блокировки.

28.08.2012
  • Привет, Суреш, я использую 64-битную JVM, я точно настроил JVM для своей вычислительной программы. Не могли бы вы уточнить, как вы разбиваете задачи на задания и работаете с ними в отдельной JVM. Спасибо 29.08.2012
  • Я изолировал пакетные обрабатываемые задания, которые не нужно выполнять в пользовательском потоке, и запускал их на узлах, которые не обращены к пользователю. Это означает, что в кластере есть как минимум два узла. Один пользователь сталкивается, а другой выполняет пакетную обработку с заданиями, запускаемыми планировщиком, таким как кварц. 03.09.2012
  • Другая возможность, если вы запускаете задание обработки изображения на основе какой-либо задачи, активированной пользователем. Вместо того, чтобы запускать задание обработки изображения в процессе Java на том же компьютере, отправьте сообщение в очередь JMS и создайте прослушиватели JMS, которые обрабатывают информацию об изображении за пределами вашего компьютера. 03.09.2012
  • да, я думаю, что это альтернатива. Я изучу оба, чтобы увидеть возможность, спасибо! 04.09.2012

  • 2

    Если я правильно понимаю, вам нужен балансировщик нагрузки.

    1. Имейте балансировщик нагрузки для маршрутизации к одному из нескольких экземпляров вашего веб-сервиса/вычислительного движка. Вы можете добиться этого, используя esb, механизм маршрутизации, кластерный, главный-подчиненный, распределенный кеш и т. д., большинство из которых взаимосвязаны. Кроме того, вы можете запускать дополнительные узлы в режиме реального времени на EC2 в зависимости от нагрузки.

    2. В противном случае, если задачу можно прервать, делегируйте ее нескольким узлам/службам. Вам понадобится некоторый механизм оркестровки.

    Существуют решения с открытым исходным кодом, которые могут решить 1 и 2 выше.

    29.08.2012
  • спасибо за ваше предложение, javausersoma. Я собираюсь использовать балансировщик нагрузки в своей производственной среде, но я все еще хочу найти способ, если это возможно, отделить веб-сервис от вычислительного движка. Вычислительный движок можно разбить на другую задачу или запустить в другой JVM. Мне интересно делегировать его нескольким узлам/службам. Не могли бы вы рассказать мне немного об этом, чтобы я мог начать поиск в Google. :) Спасибо! 29.08.2012
  • ryo, если вы смотрите на сценарий в реальном времени, вы можете сделать это в самом esb. Если вы планируете использовать верблюд в esb, он предоставляет возможность объединения результатов нескольких вызовов с использованием агрегации и параллельной обработки. Вероятно, многие esbs имеют подобный механизм. рабочий процесс и оркестровка действий — некоторые идеи, но они не очень реальны. 01.09.2012
  • Я прочитаю немного больше о верблюде, так как он поддерживает структуру Spring. Спасибо! 04.09.2012

  • 3

    Бэкенд работает синхронно? Я имею в виду, когда мобильные клиенты что-то запрашивают, должны ли они ждать, пока серверная часть выполнит большую часть обработки?

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

    У вас есть повторно используемые данные? если да, вы можете использовать что-то вроде memcached.

    Надеюсь, это поможет, если вы дадите нам больше информации, я уверен, что мы дадим лучший совет.

    28.08.2012
  • Привет, psabbate, мобильный телефон и веб-сайт будут запрашивать обработанные данные изображения синхронно, на самом деле я проделал некоторую работу во внешнем интерфейсе, чтобы дождаться внутренних вычислений. Я очень надеялся, что у меня может быть какой-то режим master-slave в веб-службе, если какие-либо данные запрашиваются у клиента, веб-служба создаст задание и отправит его ведомому, а ведомый может работать над ним. 29.08.2012
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...