Как создать распределенное приложение Java?

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

Во-вторых, я хочу создать систему, которая выполняет четыре типа задач, будет несколько клиентов, и у каждого из них будет много задач каждого типа, которые будут запускаться периодически. Например: customer1 будет иметь task_type1 сегодня, task_type2 через два дня и так далее, может быть клиент2, у которого есть task_type1, который будет выполняться одновременно с customer1 task_type1. т.е. существует необходимость в concurrency. Конфигурация для выполнения задач будет храниться в БД, и результаты этих задач также будут сохранены в БД. клиенты будут использовать систему из веб-браузера (html-страницы) для взаимодействия с системой (в основном, настраивать задачи и видеть результаты). Я подумал об использовании веб-сервиса rest (используя JAX-RS), где html-страницы будут взаимодействовать с бэкэнд и использовать потоки для параллельного выполнения. Вопросы:

  • Это звучит просто, но я иду в правильном направлении? или я должен использовать другие технологии или концепции, например Java Beans?

2.Если мой подход прекрасен, мне нужно использовать язык сценариев, например JSP, или я могу отправить html-формы непосредственно на остальные URL-адреса и получить результат (например, с помощью JSON)?

  • Если я хочу, чтобы приложение было распространено, возможно ли это с моей идеей? Если не то, что мне нужно будет использовать?

Извините за то, что у меня много вопросов, но я действительно смущен этим.

Ответ 1

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

Если вам кажется, что вам может понадобиться распространить приложение для масштабируемости, первое, о чем вы должны подумать, это не веб-службы и многопоточность, а очереди сообщений и Enterprise JavaBeans и...

Первое, о чем нужно подумать, это ваш домен приложения и то, что приложение будет делать. Где будут компоненты, интенсивные для процессора? Какие зависимости между этими частями? Разделяют ли части системы естественно параллельные процессы? Если нет, можете ли вы перепроектировать систему, чтобы сделать так? ВАЖНО: какие данные необходимо обменивать между потоками/процессами (независимо от того, работают ли они на тех же или разных машинах)?

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

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

Ответ 2

Термин "распределенное приложение" означает, что части прикладной системы будут выполняться на разных вычислительных узлах (которые могут быть разными CPU/ядрами на разных компьютерах или между несколькими CPU/ядрами на одном компьютере).

Существует множество различных технологических решений вопроса о том, как можно построить систему. Поскольку вы спрашивали о технологиях Java, вы можете, например, создать веб-приложение с помощью Google Web Toolkit, что даст вам богатый опыт работы с клиентами на основе браузера. Для развернутых сервером частей вашей системы вы можете начать с использования простых сервлетов, работающих в контейнере сервлетов, таких как Tomcat. Ваши сервлеты будут вызываться из браузера с помощью HTTP-вызовов удаленных процедур.

Позже, если вы столкнетесь с проблемами масштабируемости, вы можете начать переносить части бизнес-логики на компоненты EJB3, которые сами могут в конечном итоге развернуться на многих вычислительных узлах в контексте сервера приложений, например Glassfish. Я не думаю, что вам не нужно решать эту проблему, пока вы ее не запустите. Трудно сказать, не будете ли вы больше знать о характере задач, которые будет выполнять клиент.

Ответ 3

Чтобы ответить на ваш первый вопрос - вы могли получить форму для отправки напрямую на остальные URL-адреса. Очевидно, что это точно зависит от ваших требований.

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

Если вы хотите создать динамически распределенное приложение, для запуска, например, нескольких виртуальных машин с низким уровнем ресурсов (таких как экземпляры Amazon EC2 Micro) или физического оборудования, которые могут быть добавлены и удалены по желанию, чтобы справиться со спросом, тогда вы возможно, пожелает рассмотреть возможность интеграции с Project Shoal, которая представляет собой структуру Java, которая позволяет кластеризовать узлы приложения и иметь их при появлении/исчезновении время. Project Shoal использует JXTA и JGroups в качестве основного коммуникационного протокола.

Другим способом может быть распространение вашего приложения с помощью EJB, запущенного на сервере приложений.