Синхронные вызовы в модели akka/actor

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


person Brian DiCasa    schedule 04.11.2011    source источник


Ответы (2)


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

person Viktor Klang    schedule 06.11.2011

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

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

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

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

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

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

person Ramón J Romero y Vigil    schedule 08.11.2015