Распространение потоков java на нескольких серверах?

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

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

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

4 ответа

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

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

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

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

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


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

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


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

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

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

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

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

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

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


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

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

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

licensed under cc by-sa 3.0 with attribution.