2016-06-06 4 views
3

나는 n의 Akka-stream 흐름 이후에 하나의 결과를 가져와 요청을해야하는 유스 케이스가 있습니다. HTTP REST API에 연결합니다. 스칼라 스트림에서 akka-http 흐름을 결합하는 가장 좋은 방법은 무엇입니까

HTTP 요청하기 전에 마지막 akka 스트림 흐름 유형,

문자열입니다 : 다음

val stream2: Flow[String,Future[HttpRespone],NotUsed] = Flow[String].map(param => Http.singleRequest(HttpRequest(uri=s"host.com/$param"))) 

과 :

지금
val stream1:Flow[T,String,NotUsed] = Flow[T].map(_.toString) 

, HTTP 요청을 지정해야, 내가 좋아하는 뭔가에 대해 생각 그것을 결합하십시오 :

val stream3 = stream1 via stream2 

그것을하는 가장 좋은 방법은 있습니까? 너희들이 실제로 추천 할만한 방법과 그 이유는 무엇인가? 이 유스 케이스의 범위에있는 최상의 실습 사례 몇 개는 훌륭 할 것이다! 사전에

감사합니다 :)

+0

'Flow [String, HttpResponse, NotUsed]'가 아닌 'Flow [String, Future [HttpResponse, NotUsed]]를 정말로 원하십니까? –

+0

Hey Ruediger, Future [String]는 실제로 Http.singleRequest (...)에 의해 반환되는 것이지만 어쨌든 그것은 문제가 아닙니다. –

답변

3

귀하의 구현은 각각의 새로운 PARAM에 대한 "host.com"에 새 연결을 만들 것입니다. 이것은 불필요하며 akka가 특정 최적화를 수행하는 것을 방지합니다. 후드 아래에서 akka는 실제로 연결을 다시 열어 연결을 유지하지만 코드에서 의도를 지정하고 기본 구현에 의존하지 않는 것이 좋습니다.

val connectionFlow: Flow[HttpRequest, HttpResponse, _] = 
    Http().outgoingConnection("host.com") 

이 연결하면 HttpRequest 객체에 문자열 경로를 변환해야합니다 흐름 활용하기 :

import akka.http.scaladsl.model.Uri 
import akka.http.scaladsl.model.Uri.Path 

def pathToRequest(path : String) = HttpRequest(uri=Uri.Empty.withPath(Path(path))) 

val reqFlow = Flow[String] map pathToRequest 

을 그리고, documentation에 설명 된대로

는 단일 연결을 만들 수 있습니다 마지막으로 모든 흐름을 함께 붙입니다.

val stream3 = stream1 via reqFlow via connectionFlow 

이는 서로 다른 요청 객체를 사용하여 동일한 서버를 계속 질의하는 가장 일반적인 패턴입니다.

+0

안녕 라몬! 제 질문에 답변 해 주셔서 감사합니다. Http.singleRequest (...)의 문서에 따르면 : * 요청에 대한 (캐시 된) 호스트 연결 풀을 가로 질러 단일 [[HttpRequest]]를 발생시킵니다. 그래서 캐시 된 연결 풀을 사용합니다. 후드. –

+0

내 답변에 명시된 바와 같이 기본 캐시가 있다는 데 동의합니다. 하지만 직접 연결을 설정하고 동일한 연결을 다시 사용할 수있을 때 akka 캐시의 설정/논리에 의존하는 이유는 무엇입니까? –

+0

[akka-documentation] (http://doc.akka.io/docs/akka/2.4.7/scala/http/client-side/connection-level.html#Opening_HTTP_Connections)에 따르면 : '연결이 없습니다. 반환 된 흐름이 실제로 구체화 될 때까지 시도됩니다. 플로우가 여러 번 구체화되면 여러 개의 독립적 인 연결이 열립니다 (materialization 당 하나). 어떤 이유로 든 연결 시도가 실패하면 구체화 된 플로우는 즉시 해당 예외로 종료됩니다. 즉, 솔루션이 N 개의 구체화 된 플로우에 대해 N 개의 연결을 생성합니다. –

관련 문제