Wymagania: Na tym samym serwerze procesy komunikują się ze sobą za pomocą anonimowych potoków, nazwanych potoków, plików mapowania pamięci, HTTP, TCP, standardowych strumieni wejścia/wyjścia itd. Czasami serwery muszą wdrożyć wiele aplikacji, a aplikacje mogą faktycznie komunikować się ze sobą za pomocą gniazd domenowych gRPC i Unix.
recenzja
Gniazda domeny Unix
Gniazda domenowe Unix (UDS), gniazda lokalne lub sockety komunikacji międzyprocesowej (IPC) to punkty końcowe komunikacji, które wymieniają dane między procesami działającymi w tym samym systemie operacyjnym Unix lub podobnym do Unix.
Nazwa gniazdo domenowe Unix odnosi się do wartości parametru domeny przekazywanej funkcji, która stworzyła zasób systemu gniazda. Wybierana jest również ta sama domena komunikacji. [ 1 ] AF_UNIXAF_LOCAL
Prawidłowe wartości parametrów dla typeUDS to:
- SOCK_STREAM (w porównaniu do TCP) – Używany dla gniazd zorientowanych strumieniowo
- SOCK_DGRAM (w porównaniu do UDP) – gniazdo zorientowane na datagramy do zachowania granic komunikatów (jak w większości implementacji UNIX, gniazda datagramów domeny UNIX są zawsze niezawodne i nie zmieniają kolejności datagramów)
- SOCK_SEQPACKET (w porównaniu do SCTP) – Sekwencyjne gniazda pakietów dla połączeń, które zachowują granice wiadomości i dostarczają je w kolejności ich wysyłania
Narzędzie UDS jest standardowym komponentem systemu operacyjnego POSIX.
Dlaczego warto używać socketów domenowych Unix?
Gniazda domeny Unix umożliwiają komunikację międzyprocesową na jednej maszynie. Dlaczego więc wybrać ich zamiast TCP/IP? Na przykład w TCP/IP można użyć adresu pętli (localhost) do komunikacji pojedynczego serwera. Dlaczego na Windowsie wybierasz ich zamiast Windows Naming Pipelines?
Ogólnie rzecz biorąc, istnieje kilka powodów, dla których możesz zdecydować się na UDS zamiast TCP/IP do komunikacji międzyprocesowej:
- Gniazda domeny Unix zazwyczaj mają mniejszy narzut i szybsze prędkości transferu niż TCP/IP
- Gniazda TCP/IP są zasobem ograniczonym, podczas gdy gniazda domeny Unix nie mają twardych ograniczeń
- Gniazda domeny Unix dostępne są w formie plików, więc łatwo jest "odkryć" znane ścieżki
- Integracja z systemami plików dodaje dodatkową warstwę bezpieczeństwa (jeśli nie masz dostępu do ścieżki pliku, nie możesz uzyskać dostępu do gniazda)
Pierwszy punkt jest łatwy do zrozumienia – szybkie wyszukiwanie w Google pokaże, że benchmarki UDS i TCP/IP są zawsze lepsze niż UDS, ponieważ mają nie tylko znacznie niższe opóźnienia, ale też znacznie wyższą przepustowość. Wynika to głównie z faktu, że UDS jest zoptymalizowany do komunikacji z tym samym serwerem,W przypadku komunikacji IP localhost musi przejść przez stos IP zarówno po stronie nadawcy, jak i odbiorcy。
Gniazda TCP/IP są zasobem ograniczonym; Możesz używać maksymalnie 65 535 gniazd jednocześnie. Jeśli dodasz problem, maksymalna liczba TIME_WAIT dostępnych gniazd może być znacznie mniejsza niż ta wartość. Połączenie localhost również zużywa gniazda w tej puli. Użycie UDS sprytnie unika tego problemu; Umożliwia komunikację bez wyczerpywania gniazd TCP/IP.
serwer
Stwórz nowy projekt konsoli .NET 8, zmień SDK na Microsoft.NET.Sdk.Web i skonfiguruj go następująco:
Greet.proto jest skonfigurowany następująco:
Kod jest następujący:
Po rozpoczęciu kompilacji, jak pokazano poniżej:
klient
Stwórz nowy projekt konsolowy .NET 8 i odwołaj się do następujących bibliotek:
Metoda wywoływania interfejsu gRPC jest wywoływana 10 razy, a każde wywołanie trwa 200 milisekund, a kod jest następujący:
Rozpocznij projekt, a po jego zakończeniu, jak pokazano na poniższym rysunku:
Odniesienie:
Logowanie do linku jest widoczne.
Logowanie do linku jest widoczne. |