2015-07-12 3 views
1

Учитывая следующий код Spray:спрей `detach` Директивы

object Main extends App with SimpleRoutingApp { 

    implicit val system = ActorSystem("my-system") 

    val pipeline: HttpRequest => Future[String] = sendReceive ~> unmarshal[String] 

    startServer(interface = "localhost", port = 8080) { 
    path("go") { 
     get { 
     detach() { 
      complete { 
      val req = Post("http://www.google.com") ~> addHeader("Foo", "bar") 
      pipeline(req).recoverWith[String]{ case _ => Future { "error!" } } 
      } 
     } 
     } 
    } 
    } 
} 

я поставил функцию complete в detach директивы.

Документах объяснить, что отрывать будет: execute the inner route inside a future.

Какое значение использования (или нет) detach - от производительности точки зрения?

Я посмотрел на это связанный answer, но он фокусируется на том, как использовать отсоединение.

ответ

4

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

Однако биты маршрутизации, которые являются асинхронными, например завершение с помощью Future или с использованием одного из FutureDirectives, также освободят оригинального участника маршрутизации для новых запросов.

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

Кроме того, detach поставляется с некоторыми несоответствиями вы можете прочитать о здесь:

Альтернатива использованию detach использует каждый запрос-актер.

В akka-http, маршрутизация реализована поверх фьючерсов, чтобы быть как можно более асинхронной и не ограничиваться актером, так что detach не требуется и поэтому был удален.

+0

Попытка понять ваши первые несколько предложений - не будет использовать 'detach' и вызывать' Await.result' внутри результата 'route' только в одном HTTP-запросе, обрабатываемом одновременно, т. Е. Одновременно веб-приложением? –

+0

https://groups.google.com/forum/#!topic/spray-user/ml3auuHoq_4 –

+0

Ответьте также: да, это правда. Если не используются асинхронные директивы, блокировка в структуре маршрута предотвратит асинхронную обработку маршрута. – jrudolph

0

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

+0

Вы говорите, что без 'detach', веб-сервер спрей будет обрабатывать HTTP-запросы по одному, т. Е. Он не может обрабатывать более одного запроса одновременно? Не могли бы вы предоставить источник? –

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