2016-03-25 8 views
5

Sto scrivendo un client per un'API di resto che utilizza la libreria http di akka. La libreria sembra molto potente, ma per me è molto instabile. Molto spesso (non sempre) viene generata la seguente eccezione quando si tenta di consumare un HttpResponse.entity:akka http lancia EntityStreamException: troncamento del flusso di entità

EntityStreamException: Entity flusso troncamento

e dopo questo si interrompe l'elaborazione successive richieste a tutti. Forse cerca di far fronte a qualche contropressione o agli attori che muoiono, non lo so.

Non importa come mi inviare una richiesta, utilizzando la richiesta-livello API lato client:

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 
    } 

o utilizzando il collegamento a livello di API lato client:

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 
    } 

Non importa se consumo l'entità usando unmarshaller o manualmente usando getDataBytes, il risultato è lo stesso - l'eccezione di cui sopra.

Lo stato http della risposta è 200 OK, le intestazioni sono ok, è un'entità "Predefinita" (quindi, nessun chunking), la lunghezza del contenuto è di circa 500-2000 Kb (in aumento akka.http.parsing.max- la lunghezza del contenuto non aiuta, sebbene il valore predefinito dovrebbe essere sufficiente). Anche il server è ok - altre librerie http su altre piattaforme funzionano bene con questa API.

È un errore o sto facendo qualcosa di sbagliato? Qual è la migliore libreria HTTP non bloccante, asinconica per scala?

+0

** Qual è la migliore libreria HTTP non bloccante, asinconica per scala? ** Oh ragazzo, se lo capisci, per favore fammi sapere. Abbiamo appena iniziato a usare akka http e vedo lo stesso errore con il comportamento esatto che stai vedendo. La lunghezza massima del contenuto non aiuta. Penso di aver ridotto il limite alla dimensione del contenuto, perché una volta inviata una certa quantità di dati, questo inizia a verificarsi. Tutto funziona come previsto con richieste più piccole. – haggy

+0

* Aggiornamento: * Sono stato in grado di verificare che non aveva nulla a che fare con i dati che stavo inviando. Invece di inviare 1 grande richiesta in batch, l'ho diviso in molti piccoli (usando la stessa identica API) e ha funzionato con successo. Questo sicuramente fa sembrare che ci sia un limite di dati chunked intrinseco o qualcosa che sta causando problemi di streaming con richieste più grandi. – haggy

+0

* Aggiornamento di nuovo: * Sono stato in grado di risolvere il mio problema. Era un problema di percorso di routing (sì, sul serio). Ho avuto una rotta nidificata che era in conflitto in qualche modo con un'altra rotta allo stesso livello. Una volta che ho rielaborato la struttura dei percorsi, tutto ha funzionato bene. – haggy

risposta

0

Ho commenti sulla domanda iniziale, ma anche la risposta qui in modo che possa essere svalutato nel caso in cui questo aiuti chiunque.

Si trattava di un problema di percorso di routing (sì, sul serio). Avevo una rotta nidificata che era in qualche modo in conflitto con un'altra rotta allo stesso livello (in pratica c'erano stranezze che causavano un percorso per scavalcare un altro ...). Una volta che ho rielaborato la struttura dei percorsi, tutto ha funzionato bene.

+0

Come intendi strano conflitto? Non vedo nulla di strano sui miei percorsi, tuttavia ricevo lo stesso errore abbastanza spesso (anche se non per tutte le richieste). – Alex