2014-11-25 10 views
6

Używamy funkcji sendAsynchronousRequest interfejsu NSUrlConnection do wysyłania prostych żądań POST do naszego serwera Node JS. Analizując tcpdumps, zauważyliśmy, że czasami nagłówki żądań i treść żądania są podzielone na 2 oddzielne pakiety TCP.Losowa zwłoka między nagłówkami i treścią POST

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setURL:[NSURL URLWithString:url]]; 
[request setTimeoutInterval:3]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Content-type"]; 
[request setHTTPBody:postData]; 

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler: ^(NSURLResponse *response, NSData *POSTReply, NSError *error) { }]; 

Problem polega na tym, że czasami nagłówki są wysyłane do serwera, który otwiera połączenie do naszego API, a następnie kilka sekund później ciało pakiet jest przesyłany. Widzimy> 1 sekundę opóźnienia między nagłówkami i treścią, losowo co sto żądań po stronie serwera. Jest to największe źródło opóźnień w naszym interfejsie API.

W przypadku większości żądań nagłówki i treść mają mniej więcej taki sam rozmiar (po 200 bajtów).

Czy ktoś to widział wcześniej?

+1

Nie wysyłaj żądania http w głównej kolejce. – x4snowman

Odpowiedz

0

Nie mam konkretnych informacji na temat szybkich API (NSUrlConnection itp.), Ale ogólnie, podczas gdy dane HTTP są wysyłane w dużych porcjach (które mogą pomieścić 200 bajtów w jednym pakiecie), bardziej szczegółowe decyzje są podejmowane na bazowym poziomie TCP, który może zdecydować o podzieleniu ich na porcje o mniejszych rozmiarach.

Zaobserwowałem to w węźle (strona wysyłająca, a także strona odbierająca) na konkretnych platformach (takich jak AIX), gdzie pakiety są dzielone na nielogiczne granice przez TCP. Zgodnie ze specyfikacją TCP aplikacje nie powinny opierać się na określonej kolejności lub rozmiarze niskiego poziomu transportu danych, gwarantują integralność danych na końcowym etapie.

Jednym z podejrzanych może być obecność algorytmu Nagile w TCP.

Polecam również zmienić klienta na inną platformę (np. Linuksa) i porównać zachowanie, jeśli jest to łatwe do przeniesienia kodu.

Mam nadzieję, że to pomoże.

Powiązane problemy