Tło:
Mam kod, który łączy się z serwerem w celu pobrania danych. Jednak w pewnym momencie program znalazł się w stanie, w którym nie mógł połączyć się z serwerem. Problemem, który obserwowaliśmy, jest to, że serwer nieustannie limitował czas, kiedy próbowaliśmy ponownie się połączyć.Zamknij wszystkie podstawowe połączenia sieciowe
Plugin:
Posiadamy Timeout ustawiony na wartości domyślne używane przez nasze wtyczki sieciowej (plugin Thrift). Te wartości to limit czasu 100k milisekund i 300k milisekund czasu oczekiwania na odczyt. Niezupełnie krótkie limity czasu. Za każdym razem, gdy próbujemy ponownie się połączyć, odtwarzamy klasę wtyczki, więc wszelkie wartości, które ustawia wewnętrznie, są resetowane za każdym razem, gdy próbujemy się połączyć. Uważam, że czasy oczekiwania nie są problemem. I wierzę, że wtyczka nie jest problemem.
Sieć:
Widzieliśmy, że te powtarzające się limity czasu występują przez pół godziny. Kiedy ponownie uruchomiliśmy usługę (nie maszynę), natychmiast wrócił on-line. Wiem, że to nie był problem z siecią. To prowadzi mnie do przekonania, że jest to coś w naszym kodzie, który dostaje się do nieprawidłowego stanu sieci. Poza tym jest to stan, którego nie możemy kontrolować, ponieważ nasza wtyczka ukrywa przed nami wszystkie dobre rzeczy sieciowe - w tym limity czasu, flagi keepalive i grupy połączeń (między innymi). Zasadniczo nie mamy dostępu do członka HTTPWebReqest.
Pytanie:
Kiedy nasze ustawienia sieci dostać się do tego stanu, staramy się, aby zamknąć wszystkie połączenia i ponownie połączyć się z serwerem. Celem było zabicie wszystkich aktywnych połączeń w celu zresetowania dowolnego stanu, w którym się znaleźliśmy. Jednakże, gdy próbujemy ponownie się połączyć, otrzymujemy limity czasu na ponowne połączenie.
W jakiś sposób (prawdopodobnie ze względu na KeepAlive i TCP Pipelining, których nie możemy kontrolować), połączenia sieciowe pozostają otwarte, mimo że wszystkie połączenia zostały zamknięte. To pozostawia nas w złym stanie i uniemożliwia nam odbieranie połączeń z serwerem.
Pytanie:
Jak mogę zabić wszystkie połączenia bazowych do serwera w celu wymuszenia ponownego połączenia?
Osobiście polecam zmianę biblioteki, której używasz. Ponieważ jednak jestem tobą, wiem, że to nie jest opcja. – Richard
+1. Miły komentarz własny i odpowiedź – Danexxtone