Используйте параллелизм Akka

Akka

вводить

Я начал задание, чтобы прочитать файл CSV со 100 столбцами и 100 000 строк и записать его в базу данных.

Способ 1: простая программа на Java

Итак, я начинаю с простой Java-программы, которая выполняет цикл while до EOF, а затем выполняет вызов JDBC для сохранения значения. Это заняло час, но потом я понял, что время выполнения программы заняло больше времени, чем создание программы. Так что задача не так проста, как кажется. Так что же можно сделать? Я, конечно, понимаю, что задачи нужно делать параллельно.

Метод 2: многопоточная программа Java

Тема всегда кажется мне очень сложной. Понятие «мьютекс», «семафоры» и «мониторы» заставляет меня вздрогнуть. Поэтому я попытался понять эту концепцию. Мониторы используют Java для синхронизации. Поддержка Java для синхронизации потоков. Мониторы: эксклюзив и сотрудничество.

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

Область монитора

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

В каждой лекции или статье о потоках всегда упоминается проблема потребителя и производителя. Итак, мой вопрос похож на этот, верно? У меня есть считыватель (производитель), который читает строку и передает ее на уровень JDBC (потребитель) для записи в базу данных.

Java уже предоставляет блокирующие очереди, чтобы упростить реализацию. Но я не могу создать 100 тыс. потоков для этого. Мне нужно что-то вроде пула потоков, чтобы ограничить количество потоков. Достаточно простого цикла и количества потоков. Решение выглядело красиво и архитектурно 📃, потом я понял, что забыл об обработке ошибок. Теперь я понимаю, что очень сложно обрабатывать исключения в потоках, потому что они ничего не возвращают. Есть ли у них другой путь? Так что да, в Java 1.5 есть функция «вызываемого интерфейса», которая работает как поток, но возвращает будущее. Но это другая история.

Способ 3: Java-программа с использованием Актера

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

То, что мне нужно, это рамки, которая дает мне одновременную обработку, и я могу сосредоточиться только на бизнес-логике. Я нашел такой рамки: Акка. Акка основана на модели актера Эрланга. Если вы прочитаете, как реализован вышеуказанный вопрос, он реализован с использованием стратегии тяги, где потребительская нить выполнит новую задачу после завершения текущей задачи. Поэтому нам нужно подождать, пока производитель не будет готов. Разве не было бы легче, если система была более реактивной? Для каждого события обработчик событий должен быть готов сделать работу.

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

Actors

актеры приносят вам:

  • Простые и высокоуровневые абстракции параллелизма и параллелизма.
  • Асинхронная, неблокирующая и высокопроизводительная модель программирования, управляемая событиями.
  • Очень легкий процесс, управляемый событиями (миллионы участников на кучу ГБ).

Использовать Akka очень просто. Его можно добавить как зависимость к нашему файлу project.Simple jar. Итак, давайте запачкаем руки и напишем программу Hello World. Примеры взяты из документации Akka.

Давайте определим актера, Greeter:

Greeter extends UntypedActor {
    String greeting = "";
    public void onReceive(Object message) {
        if (message instanceof WhoToGreet)
        greeting = "hello" + ((WhoToGreet) message).who;
        else if (message instanceof Greet)                                                                                // //Send the current greeting back to the sender
        getSender().tell(new Greeting(greeting), getSelf());
        else unhandled(message)    
    }
}

Да это оно. Ему просто нужно реализовать метод onRecieve, чтобы он реагировал на вызов Tell.

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

final ActorSystem system = ActorSystem.create("helloakka");
// Create the greeter actor
final ActorRef greeter = system.actorOf(Props.create(Greeter.class), "greeter");
// Tell the greeter to change its greeting message
greeter.tell(new WhoToGreet("akka"));

Таким образом, используя метод tell, вы можете вызвать этот метод. Таким образом, Akka гарантирует, что метод OnReceive вызывается только один раз. Это так просто, вам не нужно думать о синхронизации.

Akka — это очень масштабируемая часть программного обеспечения не только с точки зрения производительности, но и с точки зрения полезного размера приложения. Ядро Akka, akka-actor, очень маленькое и может быть легко добавлено в существующие проекты, где вам без проблем нужна асинхронность и параллелизм без блокировки. Кажется, что «удаленное взаимодействие» имеет смысл, верно?

Все в Akka предназначено для работы в распределенной среде: все взаимодействия акторов используют чистый обмен сообщениями и все асинхронно. Субъекты позволяют управлять сбоями служб (супервизоры), управлять нагрузкой (политики отсрочки, тайм-ауты и изоляция процессов), а также горизонтальную и вертикальную масштабируемость (добавление дополнительных ядер или машин).

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

Английский оригинал:D zone.com/articles/co…

Посмотреть больше статей

Общедоступный номер: Galaxy № 1

Контактный адрес электронной почты: public@space-explore.com

(Пожалуйста, не перепечатывайте без разрешения)