2015-11-13 4 views
5

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

public static class Worker extends UntypedActor { 
    // Run Very Long Process 
    public void onReceive(Object message) { 
    if (message instanceof Work) { 
     Work work = (Work) message; 
     double result = veryLongProcess(work.getStart(),work.getNrOfElements()); 
     getSender().tell(new Result(result), getSelf()); 
    } else { 
     unhandled(message); 
    } 
    } 
} 

Мой вопрос: может ли Акка манипулировать актерами, занимая иногда часы, чтобы вернуться из их исполнения?

+1

Вы можете настроить диспетчер должен быть подходящей моделью потока для вашего приложения. Вероятно, вы хотите настроить отдельный пул потоков для диспетчера, выполняющего медленные задачи, и оставить диспетчера по умолчанию для других участников, выполняющих непродолжительные задачи. http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.html, это хорошая идея, чтобы прочитать все документы, когда приходите в такую ​​богатую структуру, чтобы получить представление обо всех настраиваемых частях. – simbo1905

+0

Хорошо, это имеет смысл. Думаю, моя забота заключается в том, что у Akka есть какой-то тайм-аут или какая-то другая особенность, которая после определенного количества прошедшего времени предположила, что актер умер. –

+0

По моему опыту, работа просто тащится в почтовых ящиках актера до тех пор, пока вы не закончите кучу или нити. Таким образом, управление ресурсами - это то, что вам нужно сконструировать в конфигурации. Простые вещи просты, возможны сложные вещи. Мой верхний совет не делает все актером. Фьючерсы также являются вашим другом и используют только актеров, чтобы упростить многозадачность и дистанционное управление. – simbo1905

ответ

2

Ответ на ваш вопрос напрямую; есть good article на этой самую тему:

Опять же, если вы затянувшееся вычисления, имея их работать в отдельных исполнениях ExecutionContext для CPU переплете задача является хорошей идеей.

В статье имеет следующий пример:

import java.util.concurrent.Executors 
import concurrent.ExecutionContext 

//I added 'private' for the rest of the example 
private val executorService = Executors.newFixedThreadPool(4) 
private val executionContext = ExecutionContext.fromExecutorService(executorService) 

Ответ на косвенно,

Фьючерсы Первого

Я полностью согласен, что Akka Актеры являются очень полезным инструментом для конкретных типов Работа. Когда дело доходит до кеширования, Actors & Agents - лучшая игра в городе.

Однако в этом случае я бы предложил использовать Future вместо Актера. Вы можете сделать veryLongProcess функцией private. Конфиденциальность обеспечит полный контроль над количеством потоков, вызывающих метод:

def longProcessFut(start : Int, noOfElements : Int) : Future[Result] = Future { 
    veryLongProcess(start, noOfElements) 
}(executionContext)//controls the executing pool of veryLongProcess 

Простой, лаконичный и асинхронный.

Отсутствие убийства писем, отсутствие перегруженного метода приема, который принимает что-либо под солнцем, а также реквизит, даже для ActorRef не было необходимости в будущем. Блум, пивной живот, я говорю!

Кроме того, ваш пользователь будет не создать будущее, независимо от того, что из-за ?:

//Actor user code, too verbose 

val longProcessRef = actorSystem actorOf Props[Worker] 

val fut : Future[Result] = (longProcessRef ? Work(0,42)).mapTo[Result] 

По сравнению с использованием фьючерсов непосредственно

//happy user code 

val fut : Future[Result] = longProcessFut(0, 42) 

То же большое будущее, но половина калорий!

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

+0

Спасибо за потрясающий и тщательный ответ! Мой оставшийся вопрос будет заключаться в том, что вы все еще можете получить доступ к удаленному модулю Akka с использованием Futures? Мы будем иметь высокую нагрузку на систему, и цель состоит в том, чтобы иметь возможность распространять эти вычисления по n числу машин. –

+0

Я не знаю о какой-либо функциональности для запуска фьючерсов удаленно, поэтому у Актеров все еще есть это преимущество. Однако, когда я лично делаю распределенные вычисления, я использую Apache Spark или Akka Streams (а не Actors напрямую). –

0

Если долго работает бизнес-логика/алгоритм инкрементального, производит промежуточные результаты и/или может работать на самом долгое время, то вы можете повторно использовать отличные дизайнерские фрагменты здесь: Incremental processing in an akka actor

Смежные вопросы