Директива по отрыву спрея

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

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 функция в рамках директивы отсоединения.

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

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

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

2 ответа

Решение

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

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

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

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

Альтернатива использованию detach использует актеров по запросу.

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

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

Другие вопросы по тегам