Pracuję nad aplikacją, która wymaga jednego typu wiadomości, aby trafić w bazę danych, i innego typu wiadomości, aby przejść do zewnętrznego api XML.HttpWebRequest i porty do zakończenia operacji wejścia/wyjścia
Muszę przetworzyć DUŻO ... jednym z największych wyzwań jest uzyskanie dobrej wydajności klasy HttpWebRequest. Początkowo zacząłem od używania standardowych metod synchronicznych i łączenia wątków. To nie było dobre.
Po pewnym lekturze przekonałem się, że zalecanym sposobem jest użycie metod Begin/End, aby przekazać pracę do portów zakończenia IO, co zwalnia pulę wątków i zapewnia lepszą wydajność. Wydaje się, że tak nie jest ... wydajność jest nieznacznie lepsza, ale z pewnością nie widzę zbyt dużych portów zakończenia operacji wejścia w porównaniu do wątków.
Mam wątek, który obraca się wokół i wysyła mi dostępne wątki robocze + porty zakończenia w wątku. Porty zakończeń są zawsze bardzo niskie (maks. Widziałem 9) i zawsze używam około 120 wątków roboczych (czasami więcej). Używam rozpoczęcia/zakończenia wzór dla wszystkich metod w httpwebrequest
:
Begin/EndGetRequestStream
Begin/EndWrite (Stream)
Begin/EndGetResponse
Begin/EndRead (Stream)
robię to dobrze? Czy czegoś brakuje? Mogę używać (czasami) do 2048 połączeń http jednocześnie (z wyjścia netstat) - dlaczego numery portów zakończenia byłyby tak niskie?
Jeśli ktoś mógłby udzielić poważnej porady na temat tego, jak dobrze radzić sobie z tymi wątkami zarządzania, portami zakończenia i httpwebrequest
, byłoby to niezwykle cenne!
EDIT: czy .NET jest rozsądnym narzędziem do tego? Czy mogę uzyskać dużą liczbę połączeń HTTP pracujących z .NET i stosem System.Net? Sugerowano użycie czegoś takiego jak WinHttp (lub jakiejś innej biblioteki C++) i wybranie go z .NET, ale nie jest to coś, co szczególnie chcę zrobić!
Czy Twój zewnętrzny interfejs API odpowiednio obsługuje ładowanie? Mam usługę zewnętrzną, której używam, jeśli wysyłam zbyt wiele żądań, istnieje wymierna degeneracja wydajności na serwerze usług. – btlog
@btlog -> tak, tak jakbym wyłączał niektórych zewnętrznych dostawców, inni dostawcy wydajniej spędzają czas (ale otrzymują taką samą liczbę połączeń). jeśli problem dotyczył woluminu po ich stronie, to bez względu na to, co zrobiłem innym usługom xml, nie wpłynęłoby to na pozostałe. – peteisace