akka-http에서 HttpEntity
본문 (Source
)을 제외하고 akka-http에서 HttpRequest
과 HttpResponse
은 대부분 변경 불가능한 개체입니다.액자 간 Akka HttpEntity 보내기
다른 배우 (특히 원격 배우)에게 요청, 응답 또는 솔로 개체를 보내는 것이 안전합니까? 아니면 몇 가지 예방 조치가 필요합니까?
akka-http에서 HttpEntity
본문 (Source
)을 제외하고 akka-http에서 HttpRequest
과 HttpResponse
은 대부분 변경 불가능한 개체입니다.액자 간 Akka HttpEntity 보내기
다른 배우 (특히 원격 배우)에게 요청, 응답 또는 솔로 개체를 보내는 것이 안전합니까? 아니면 몇 가지 예방 조치가 필요합니까?
설명에 명시된대로 : HttpEntity
을 리모컨 Actor
으로 보내는 것은 소켓 제한으로 인해 작동하지 않을 수 있습니다. 또한 증거 the documentation (강조 그들의)에서 찾을 수 있습니다
중요 : 메시지는 모든 종류의 객체 수 있지만 불변 할 수 있습니다. 스칼라는 불변성을 적용 할 수 없으므로 (아직) 규칙을 준수해야합니다. ByteString는 불변이기 때문에
그러나, Source
에서 오는 ByteString
값은 소스 자체와 동일한 제한이 없습니다. 로컬 akka-http
ActorSystem에서 소스를 빼고 ByteString
값을 원격 액터로 보낼 수 있습니다.
예를 들어 utf-8 기반 HttpEntity의 모든 문자를 대문자로 사용하려면 액터를 사용한다고 가정 해 보겠습니다. 당신은 설정하여 배우를 할 수 있습니다 소스는 데이터가오고있다 소켓의 라이프 사이클에 바인딩
val actorRef = ??? //setup the ref to remote UpperActor
/**Query the Actor*/
val dispatchByteString : (ByteString) => Future[String] =
(byteString : ByteString) => (actorRef ? byteString).mapTo[String]
val parallelism = 10 // should match your Actor's mailbox size
/**Construct the Response Source.*/
val requestToSrc : (HttpRequest) => Source[ChunkStreamPart,_] =
(_ : HttpRequest).entity
.dataBytes
.mapAsync(parallelism)(dispatchByteString)
.map(ChunkStreamPart.apply)
val contentType = ContentTypes.`text/plain(UTF-8)`
val route = extractRequest { request =>
complete(HttpResponse(entity = Chunked(contentType, requestToSrc(request))))
}
: 같은
는그런 다음 akka-HTTP는 볼 수 있었다. 원격 시스템으로 전달하면 실제로 작동 할 것이라고 상상할 수는 없습니다. – Falmarri
'Source' (와'HttpEntity')도 사실 불변이므로, 로컬 액터로 전달하면 작동 할 수도 있습니다. 그러나 그들은 (@Falmarri의 코멘트에 따라) 직렬화 할 수 없기 때문에 리모팅은 작동하지 않을 것이다. –
작동 방식이 있습니까? akka-http 구체적 또는 원격 소스 중 일반적으로? 원격 스트리밍 구조에서 akka 스트리밍을 사용하고 싱크대에 연결하는 방법을 상상해보십시오. – kag0