В последнее время я изучаю Akka, и это похоже на отличную основу для создания масштабируемых серверов на JVM. Однако большинство библиотек в JVM блокируются (например, JDBC), поэтому не теряете ли вы преимущества производительности от использования модели, основанной на событиях, потому что ваши потоки всегда будут заблокированы? Делает ли Akka что-то, чтобы обойти это? Или это просто то, с чем вам придется жить, пока мы не получим больше неблокирующих библиотек на JVM?
Синхронные вызовы в модели akka/actor
Ответы (2)
Взгляните на CQRS, он значительно улучшает масштабируемость, отделяя чтение от записи. Это означает, что вы можете масштабировать чтение отдельно от записи.
С упомянутыми вами типами проблем с блокировкой ввода-вывода 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 фактически возвращается из базы данных. Вы можете указать последовательность вычислительных шагов до поступления данных. Все асинхронно.