Vereisten: Op dezelfde server communiceren processen met elkaar via anonieme pijplijnen, benoemde pijplijnen, geheugenmappingbestanden, HTTP, TCP, standaard invoer-/uitvoerstromen, enzovoort. Soms moeten servers meerdere applicaties deployen, en applicaties kunnen daadwerkelijk met elkaar communiceren via gRPC- en Unix-domeinsockets.
recensie
Unix-domeinsockets
Unix Domain Sockets (UDS), Local Sockets of Interprocess Communication (IPC) sockets zijn communicatie-endpoints die gegevens uitwisselen tussen processen die draaien op hetzelfde Unix- of Unix-achtige besturingssysteem.
De naam Unix-domeinsocket verwijst naar de domeinparameterwaarde die wordt doorgegeven aan de functie die de socketsysteemresource heeft aangemaakt. Hetzelfde communicatiedomein wordt ook geselecteerd. [ 1 ] AF_UNIXAF_LOCAL
De geldige parameterwaarden voor typeUDS zijn:
- SOCK_STREAM (vergeleken met TCP) – Gebruikt voor stream-oriented sockets
- SOCK_DGRAM (vergeleken met UDP) – een datagram-georiënteerde socket voor het behouden van berichtgrenzen (zoals bij de meeste UNIX-implementaties zijn UNIX-domein-datagramsockets altijd betrouwbaar en herschikken ze datagrammen niet)
- SOCK_SEQPACKET (vergeleken met SCTP) – Sequentiële packet sockets voor verbindingen die berichtgrenzen behouden en berichten afleveren in de volgorde waarin ze worden verzonden
De UDS-tool is een standaardcomponent van het POSIX-besturingssysteem.
Waarom Unix-domeinsockets gebruiken?
Unix-domeinsockets maken interprocescommunicatie op één machine mogelijk. Waarom zou je dan voor hen kiezen boven TCP/IP? Bijvoorbeeld, in TCP/IP kun je een loopback-adres (localhost) gebruiken voor communicatie met één server. Waarom zou je op Windows voor hen kiezen boven Windows Naming Pipelines?
Over het algemeen zijn er verschillende redenen waarom je ervoor zou kunnen kiezen om UDS te gebruiken in plaats van TCP/IP voor interprocescommunicatie:
- Unix-domeinsockets hebben doorgaans minder overhead en snellere overdrachtssnelheden dan het gebruik van TCP/IP
- TCP/IP-sockets zijn een eindige bron, terwijl Unix-domeinsockets geen harde limieten kennen
- Unix-domeinsockets zijn er in bestandsvorm, dus het is makkelijk om bekende paden te "ontdekken"
- Integratie met bestandssystemen voegt ook een extra beveiligingslaag toe (als je geen toegang hebt tot het bestandspad, kun je de socket niet bereiken)
Het eerste punt is makkelijk te begrijpen - een snelle Google laat zien dat UDS- en TCP/IP-benchmarks altijd beter zijn dan UDS omdat het niet alleen aanzienlijk lagere latentie heeft, maar ook aanzienlijk hogere doorvoersnelheid. Dit komt vooral doordat UDS geoptimaliseerd is voor communicatie met dezelfde server.Voor IP-communicatie moet localhost via de IP-stack aan zowel de zender- als ontvangerzijde gaan。
TCP/IP-sockets zijn een eindige bron; Je kunt maar tot 65.535 sockets tegelijk gebruiken. Als je het probleem erbij optelt, kan het maximale aantal stopcontacten dat daadwerkelijk beschikbaar TIME_WAIT veel minder zijn dan deze waarde. De localhost-verbinding verbruikt ook sockets in deze pool. Het gebruik van UDS vermijdt dit probleem op slimme wijze; Het maakt communicatie mogelijk zonder TCP/IP-sockets uit te putten.
server
Maak een nieuw .NET 8 consoleproject, verander de SDK naar Microsoft.NET.Sdk.Web en configureer het als volgt:
Greet.proto is als volgt geconfigureerd:
De code is als volgt:
Na de start van de compilatie, zoals hieronder getoond:
klant
Maak een nieuw .NET 8 consoleproject aan en verwijs naar de volgende bibliotheken:
De methode om de gRPC-interface aan te roepen wordt 10 keer aangeroepen, en elke oproep wordt 200 milliseconden lang aangeroepen, en de code is als volgt:
Begin het project, en nadat de uitvoering is afgerond, zoals weergegeven in de onderstaande figuur:
Referentie:
De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar. |