2012-03-02 2 views
8

Я довольно новичок в java и действительно наслаждаюсь изучением этого. Я создал программу, которая работает хорошо, но занимает немного времени, когда я добавляю больше данных для ее обработки. Я сделал это в потоковом режиме, и это действительно ускорило его, но теперь я думаю о попытке ускорить его (очевидно, больше данных, которые он должен обработать, дольше, чем это требуется). Просто fyi, моя программа не передает никаких данных между потоками, она получает один элемент списка и выполняет некоторую математику и загружает результат в базу данных. В идеале, несколько рабочих компьютеров получают несколько элементов списка, а затем выполняют свою работу, а затем получают больше работы до его завершения.Распределение потоков Java по нескольким серверам?

Я сделал несколько исследований и нашел очереди, и не уверен, что это то, что мне нужно или если есть что-то другое (также я думал, что поддерживать честность/контроль над рабочими может быть слишком много для меня, чтобы писать как новичок). У меня есть 4 компьютера дома (некоторые Linux, Mac и Windows ... но я могу установить linux vm во всех системах nonlinux, если эти решения являются специфическими для ОС) и хотел попытаться заставить их начать работу над этой задачей. Я думал о создании очередей Java, которые другие клиенты берут на себя и обрабатывают, но я также видел библиотеки (rabbitmq). Я также кратко рассмотрел grid-вычисления.

Это путь, или есть лучший способ? Мне не нужен какой-либо код или что-то еще, просто хочу знать, какие решения для распространения потоков или какие факторы следует использовать при их оценке.

ответ

7

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

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

  • - подобный подход к Terracotta, распределенные структуры данных и исполнители

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

  • - Карта/Уменьшить структуру Java, чтобы легко масштабировать большие объемы данных. Обычно используется для обработки данных и агрегирования результатов.

9

Вы можете использовать JMS или Hazelcast (например, распределенный ExecutorService) для распространения работы между машинами.

В первую очередь я хотел бы улучшить алгоритмы. Вы можете обнаружить, что вы можете пойти на 2-4 раза быстрее, используя 4 машины, но вы можете повысить производительность 10-1000x за счет профилирования производительности, рефакторинга и настройки, часто с меньшей сложностью.

1

Для запуска Java не требуется виртуальная виртуальная машина. Скорее всего, ваша программа будет работать без проблем на всех трех основных операционных системах.

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

Подключите компьютеры с разъемами. Каждый рабочий может охватывать n+1 тем, где n - это количество ядер ЦП на этой машине.

2

В общем, с использованием очереди (как RabbitMQ), чтобы загрузить в «рабочие места», а затем, имеющие рабочие тянут работу вне очереди для обработки является наиболее масштабируемой шаблон, который не занимает слишком много работы вставать и работать.

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

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

Например, если задание связано с ЦП, нет смысла запускать больше потоков в одном ящике, чем у вас есть ядра для их запуска (-1 ядро, используемое для управления потоками).

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

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

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