2015-04-30 9 views
12

Quando istanza di un HttpClient, quella comune pezzo di consiglio è:HttpClient Instancing Per Service-Endpoint

Tuttavia, sulla base on this link vedo commento che credo implica un'altra regola:

L'istanza di classe HttpClient agisce come una sessione di inviare richieste HTTP. Un'istanza HttpClient è una raccolta di impostazioni applicate a tutte le richieste eseguite da tale istanza. Inoltre, ogni istanza HttpClient utilizza il proprio pool di connessioni, isolando le sue richieste da richieste eseguite da altre istanze di HttpClient.

Questo mi chiede se dovrei creare un'istanza HttpClient per ogni endpoint di servizio con cui interagisco. Per "servizio-endpoint", intendo un indirizzo di base distinto. Ciascuno dei seguenti sarebbe un distinto "service-endpoint":

Certamente se intendo utilizzare la proprietà "BaseAddress" di HttpClient e se si tratta di chiamate simultanee, sarà necessario disporre di un'istanza di HttpClient per "service-endpoint".

Tuttavia, HttpClient mi permette di specificare un indirizzo assoluto esplicitamente:

HttpClient client = new HttpClient(...); 

client.PostAsJsonAsync("http://foo.net/api/Message/", ...); 
client.PostAsJsonAsync("http://bar.com/api/Message/", ...); 
client.PostAsJsonAsync("http://wow.gov/api/Message/", ...); 
client.PostAsJsonAsync("http://now.com/api/Message/", ...); 
client.PostAsJsonAsync("http://mom.org/api/Message/", ...); 
client.PostAsJsonAsync("http://dog.com/api/Message/", ...); 

Il codice precedente funziona, ed è esattamente quello che voglio per l'applicazione corrente che sto costruendo. Ma la domanda fastidiosa rimane ... Sto facendo qualcosa di sbagliato se uso un HttpClient per tutti i service-endpoint con cui comunica la mia applicazione?

C'è una ragione per cui avrei davvero bisogno del "connection pool isolation" che è stato menzionato nella citazione sopra?

+0

* perché sto facendo in modo che molti endpoint condividano lo stesso pool di connessioni. * Potresti espanderlo? Cosa intendi per endpoint? Come userete 'HttpClient'? Per chiamare endpoint HTTP externel? –

+0

In base all'esperienza personale, penso che la risposta dipenda in gran parte dal tipo di concorrenza e di velocità necessaria. Ho scoperto che una singola istanza di un HttpClient si blocca dopo un po 'e più istanze _can_ help. Detto questo, con un volume sufficiente, esaurirai le risorse del server e potresti dover ridimensionare orizzontalmente. –

+0

Ho rivisto la mia domanda per chiarire "l'endpoint del servizio" e il problema che mi riguarda. Sì, userò HttpClient per chiamare endpoint HTTP esterni. –

risposta

2

Ma io voglio sapere se sarò compromettendo il funzionamento interno di HttpClient perché sto facendo molti punti finali condividono la stessa connessione piscina.

No, non penso che una singola istanza di HttpClient esaurirà le tue risorse, ma ciò dipende in realtà da quante richieste simultanee farai. HttpClient è progettato per soddisfare richieste simultanee e utilizzando le API asincrone come (XXXAsync), è possibile ottenere proprio questo.

Si consiglia di non dimenticare di impostare ServicePointManager.DefaultConnectionLimit su un numero più alto, in quanto il valore predefinito è 2 (richieste simultanee).

Inoltre, se pensate di colpire il muro rapidamente con una singola istanza, suggerirei come sempre di profilare l'applicazione per capire l'esatto collo di bottiglia.

+0

Questo - "Vorrei raccomandare di non dimenticare di impostare ServicePointManager.DefaultConnectionLimit su un numero più alto, poiché il suo valore predefinito è 2 (richieste simultanee)." - non è corretto. Il valore predefinito è 2 ... ma significa nessuna restrizione (le API saner utilizzano i valori -1 o 0 in modo simile). A meno che tu non imposti il ​​DefaultConnectionLimit, HttpClient creerà migliaia di connessioni simultanee senza rimpianti. –

+0

@Test_me Chi fornisce tale garanzia? Questo non è assolutamente [cosa dicono i documenti] (https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit (v = vs.110) .aspx): * Il numero massimo di simultanei connessioni consentite da un oggetto ServicePoint. * Inoltre, leggere [questo] (https://blogs.msdn.microsoft.com/jpsanders/2009/05/20/understanding-maxservicepointidletime-and-defaultconnectionlimit/). –

+0

I documenti non sono corretti: "La cosa strana è che secondo MSDN, il valore predefinito per il limite di connessione è 2. Ho anche controllato che al mio fianco utilizza il debugger che indica che effettivamente 2 è il valore predefinito. che se non si imposta esplicitamente un valore su ServicePointManager.DefaultConnectionLimit, il valore predefinito verrà ignorato poiché non ho impostato esplicitamente un valore durante i miei test HttpClient, ho pensato che fosse ignorato. " http://stackoverflow.com/questions/16194054/is-async-httpclient-from-net-4-5-a-bad-choice-for-intensive-load-applications –