Piszę klienta dla odpoczynku API przy użyciu biblioteki http akka. Biblioteka wydaje się bardzo potężna, ale działa dla mnie bardzo niestabilnie. Dość często (nie zawsze) rzuca następujący wyjątek, gdy próbuję zużywają HttpResponse.entity:Akka http wyrzuca EntityStreamException: Obcinanie strumienia jednostki
EntityStreamException: PODMIOT strumienia obcinanie
a potem zatrzymuje przetwarzanie kolejnych żądań w ogóle. Może próbuje poradzić sobie z presją lub aktorzy po prostu umierają, nie wiem.
To nie ma znaczenia, w jaki sposób mogę wysłać żądanie, używając wniosek szczebla po stronie klienta API:
def pollSearchResult(searchId: String): FutureActionResult[String, SearchResult] = {
val request = HttpRequest(GET, s"http://***/Search/$searchId")
for {
response <- Http().singleRequest(request)
entity <- Unmarshal(response.entity).to[String]
result = entity.decodeEither[SearchResult]
} yield result
}
lub używając poziomie połączenia po stronie klienta API:
val client = Http(actorSystem).outgoingConnection("***")
def pollSearchResult(searchId: String): FutureActionResult[String, SearchResult] = {
val request = HttpRequest(GET, s"Search/$searchId")
for {
response <- Source.single(request).via(client).runWith(Sink.head)
entity <- Unmarshal(response.entity).to[String]
result = entity.decodeEither[SearchResult]
} yield result
}
Nie ma wpływu na to, czy zajmuję się jednostką przy użyciu unmarshaller, czy ręcznie, używając getDataBytes, wynik jest taki sam - powyższy wyjątek.
Status http odpowiedzi wynosi 200 OK, nagłówki są w porządku, jest to element "domyślny" (czyli brak fragmentów), długość zawartości wynosi około 500-2000 kb (zwiększenie akka.http.parsing.max- długość treści nie pomaga, chociaż wartość domyślna powinna wystarczyć). Serwer też jest ok - inne biblioteki http na innych platformach działają z tym API po prostu dobrze.
Czy to błąd, czy robię coś nie tak? Jaka jest najlepsza nie blokująca, asycnhonous biblioteka http dla scala?
** Jaka jest najlepsza nie blokująca, asycnhoniczna biblioteka http dla scala? ** Och, chłopcze, jeśli to wymyślisz, daj mi znać. Właśnie rozpoczęliśmy używanie akka http i widzę ten sam błąd z dokładnym zachowaniem, które widzisz. Maksymalna długość treści nie pomaga. Wydaje mi się, że zawęziłem to do rozmiaru treści, ponieważ po wysłaniu pewnej ilości danych zaczyna się to dziać. Wszystko działa zgodnie z przeznaczeniem przy mniejszych żądaniach. – haggy
* Aktualizacja: * Udało mi się zweryfikować, że nie ma to nic wspólnego z danymi, które wysyłałem. Zamiast wysyłać 1 duże żądanie wsadowe, dzielę je na wiele małych (przy użyciu tego samego interfejsu API) i pomyślnie przeszło. To zdecydowanie sprawia, że wydaje się, że istnieje nieodłączny limit danych lub coś, co powoduje problemy z przepływem przy większych żądaniach. – haggy
* Zaktualizuj ponownie: * Udało mi się rozwiązać mój problem. To był problem ze ścieżką routingu (tak, poważnie). Miałem zagnieżdżoną trasę, która w jakiś sposób kolidowała z inną trasą na tym samym poziomie. Raz przepracowałem strukturę tras, wszystko działało dobrze. – haggy