Diagnozowanie "Connection reset by peer"

0

Cześć,
Mam serwer we flasku postawiony na heroku, który stanowi api dla aplikacji mobilnej napisanej w Xamarin.Forms. Wszystko sobie działało bezproblemowo przez parę miesięcy, ale ostatnio zaczęły się problemy (mimo, że nic nie zmieniałem). Apka mobilna odpytuje api:

            HttpResponseMessage response =
                await httpClient.GetAsync(url + "?token=" + token);
            string result = await response.Content.ReadAsStringAsync();

I wyrzuca wyjątek:

Read error: ssl=0xd6269d18: I/O error during system call, Connection reset by peer

Kod serwera:

@app.route('/get', methods=['GET'])
def get():
    clients = get_users() # pobiera z bazy danych
    token = request.args.get('token')
    
    for c in clients:
        if(c.token == token):
            return c.to_json()

    abort(400) # nie ma klienta o danym tokenie

Problem jest tylko czasami - czasem wszystko działa ok, a czasem coś idzie nie tak i jest wyjątek.
Nie mam pojęcia gdzie w ogóle szukać źródła problemu. W serwerze? W aplikacji mobilnej? Ani w jednym, ani w drugim nic nie zmieniałem, a problem pojawił się nagle. Nawet jak apka wyrzuca wyjątek, to heroku pokazuje w logach, że serwer na zapytanie odpowiedział z kodem 200.
Na razie napisałem skrypt w pythonie (biblioteka requests) który odpytuje api w taki sam sposób jak aplikacja mobilna. Puściłem go dużo razy i za każdym razem otrzymał od serwera poprawną odpowiedź. To sprawia, że zastanawiam się, czy nie należy szukać rozwiązania po stronie klienta (apki mobilnej). Choć może to tylko przypadek.

1

Współcześnie to rzadki wyjątek.
Widziałem go niedawno w logach serwera, ale klient to był komputer z mechanicznym dyskiem, zaj...ny przez komputerowców wszystkimi wgranymi przyśpieszaczami i uelpszeniami.

Dawniej zdarzał sie częściej na manualnie robionych protokołach komunikacyjnych.
Dość często to można mieć, jak się robi na nikim poziomie protokół, i np się zatrzyma na breakponcie zbyt długo, zrobi się kawę itd ...

Na twój przypadek potrafię sobie wyobrazić scenariusz (ale to tak zupełnie przy piwie)

Klient zgłasza do API wywołanie, które zaskutkuje 1000szt danych
Serwer http produkuje te dane w ilości 1000szt, zleca wysyłkę do warstwy transportowej
umieszcza w logach 200 (on swoje zrobił, transmisja to już nie jego sprawa)
klient odbiera 800szt, przez jego zabicie / przeciążenie / nieprzestrzenie protokołu / błędy
transport na serwerze czeka na transmisję pozostałych, czeka, czeka, po np 60-120 sekundach się rozsierdza i robi reset.
na kliencie pojawia się jakaś aktywność, "ktoś coś sobie przypomniał", czy to chce odebrać zapomniane 200szt informacji, czy coś innego - w każdym razie dostaje od swojego transportu "sorry, ale tamten z drugiej strony się wq i zresetował"

1 użytkowników online, w tym zalogowanych: 0, gości: 1