Unable to connect to the remote server -> IIS7 -> Wiele requestów

0

Jest następująca sytuacja, jest aplikacja kliencka, która wysyła w pętli bardzo dużą ilość danych, przypuśćmy 1500 paczek po 100 rekordów do API.
Jak otrzyma po wysłaniu pierwszej komunikat 200 wysyła następną.
API odbiera to i zapisuje do bazy. W logach nie ma nic niepokojącego.
W ciągu sekundy udaje się zapisać około 3 wywołania.
Problem jest taki, że po około mniej więcej 400-800 paczkach aplikacja kliencka dostaje: "Unable to connect to the remote server".
W logach API nie ma żadnego błędu. Tak jakby, w ogóle taki request nie przyszedł.
W logach IIS znalazłem tylko często powtarzającą się linijkę:" - - - - - Timer_ConnectionIdle" przy zbieżnym adresie klienta.

Pewnie powinno być to zrobione inaczej, przez wysłanie pliku z tymi danymi zamiast pchać to wszystko przez http ale na to nie mam wpływu.
No i teraz czy rozwiązaniem może być ograniczenie liczby paczek, przez ich zwiększenie np 150 po 1000 rekordów, dzięki czemu będzie rzadziej, i czas nieznacznie się wydłuży
bądź kazać aplikacji klienckiej czekać np 1 sekundę co obrót pętli.
Bo mam wrażenie, że z jakiegoś powodu serwer odrzuca połączenie nawet nie pozwalając na wejście do aplikacji przez to, że dostaje z tego samego adresu lawinę requestów,
taki mały DDoS. Czytałem coś o Dynamic IP Address Restrictions, który można dorzucić do IIS, i pozwolić na większa liczbę danych z tego samego adresu, ale to sugerowałoby,
że jest jakaś domyślna wartość requestów per sekunda per adres ale nie mogę znaleźć nigdzie informacji na ten temat. Myślę dobrze czy nie ma to sensu?
Bo jeszcze jest możliwość, że aplikacja kliencka robi coś nie tak ale do niej nie mam dostępu.

0

Jeśli serwer się nie wyrabia to się nie wyrabia.
Pokaż lepiej jak to zapisujesz bo może da sie zoptymalizować.

0
jacek.placek napisał(a):

Jeśli serwer się nie wyrabia to się nie wyrabia.
Pokaż lepiej jak to zapisujesz bo może da sie zoptymalizować.

Przy sytuacji jaką opisałem pojedynczy request trwał 1/3 sekundy więc chyba nie tak źle. Wygląda to mniej więcej tak, po uproszczeniu m.in. nazw:

        private Response SetItems(Guid id, List<Items> items)
        {           
            if (items == null || items.Count == 0) return Response.NoData;
            
            var xml = items.ToXml();
            _repository.SaveItems(id, xml);

            return new Response();
        }

Wywołanie procedury:

        public bool SaveItems(Guid id, string xml)
        {
            return this.RunCommand(
                "p_SaveXML",
                new SqlParameter("@cID", SqlDbType.UniqueIdentifier) { Value = id},
                new SqlParameter("@XML", SqlDbType.Xml) { Value = xml });
        }

Sama procedura to prosty marge:

MERGE [dbo].[iTabela] AS T        
  USING (         
  SELECT DISTINCT        
   x.v.value('ObjectID[1]', 'uniqueidentifier'),        
   @cID,        
   x.v.value('Day[1]', 'datetime'),        
   x.v.value('Value[1]', 'decimal(19,2)'),    
  FROM         
  @XML.nodes('/ArrayOfItems/Items') x(v)        
  ) AS S (itemId, Id, Date, Value)         
  ON (T.[ID] = S.[ID] AND T.[Date] = S.[Date]])         
  WHEN MATCHED THEN         
  UPDATE SET [Value] = S.[Value]         
   WHEN NOT MATCHED THEN        
   INSERT ([ID],[Date],[Value],[Id],[ItemID])           
   VALUES          
   (NEWID(),S.[Value],S.[Id],S.[ItmeId])         
   ;  
0
fredkolo89 napisał(a):

Problem jest taki, że po około mniej więcej 400-800 paczkach aplikacja kliencka dostaje: "Unable to connect to the remote server".
W logach API nie ma żadnego błędu. Tak jakby, w ogóle taki request nie przyszedł.

Całkiem logiczne, skoro aplikacja nie mogła się połączyć z serwerem, to jak aplikacja na serwerze miała coś zalogować?

No i teraz czy rozwiązaniem może być ograniczenie liczby paczek, przez ich zwiększenie np 150 po 1000 rekordów, dzięki czemu będzie rzadziej, i czas nieznacznie się wydłuży

Chyba tak.

bądź kazać aplikacji klienckiej czekać np 1 sekundę co obrót pętli.

Raczej nie.

że jest jakaś domyślna wartość requestów per sekunda per adres ale nie mogę znaleźć nigdzie informacji na ten temat. Myślę dobrze czy nie ma to sensu?

Może jest, ale nie słyszałem. O rate limiting zazwyczaj trzeba samemu zadbać.

Bo jeszcze jest możliwość, że aplikacja kliencka robi coś nie tak ale do niej nie mam dostępu.

Zapewne tak. Stawiam, że do każdej paczki otwiera nowe połączenie i nie zamyka go już nigdy, więc zasoby systemowe w pewnym momencie się kończą.

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