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

Фон веб-приложения:

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

Вопрос:

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

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

Обновить:

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

Update2:

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

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

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

3 ответа

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам