Синхронные звонки в модели акка / актер - PullRequest
1 голос
/ 05 ноября 2011

В последнее время я изучал Akka, и он выглядит как отличная платформа для построения масштабируемых серверов на JVM. Однако большинство библиотек в JVM блокируются (например, JDBC), поэтому не потеряете ли вы преимущества в производительности от использования модели, основанной на событиях, потому что ваши потоки всегда будут блокироваться? Акка делает что-то, чтобы обойти это? Или это просто то, с чем вам придется жить, пока мы не получим больше неблокирующих библиотек в JVM?

Ответы [ 2 ]

2 голосов
/ 06 ноября 2011

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

0 голосов
/ 08 ноября 2015

С упомянутыми выше типами проблем с блокировкой ввода-вывода Scala предлагает встроенное языковое решение, которое идеально подходит: Futures .Например:

def expensiveDBQuery(key : Key) = Future {
  //...query the database 
}

val dbResult : Future[Result] = 
  expensiveDBQuery(...) //non-blocking call

dbResult немедленно возвращается из вызова функции.Результат будет доступен в "Future".Самое интересное в будущем - то, что вы можете думать о них, как о любой старой коллекции, за исключением того, что вы никогда не можете позвонить .size о будущем.Кроме этого, все функции коллекции (например, map, filter, foreach, ...) являются честной игрой.Просто думайте о dbResult как о списке результатов.Что бы вы сделали с таким списком:

dbResult.map(_.getValues)
        .filter(values => someTestOnValues(values))
        ...

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

...