Ich schreibe einen Server für ein Online-Spiel, das am Ende 1.000-2.000 Clients verwalten soll. Die 3 Möglichkeiten, die ich dabei fand, waren im Grunde:
In der Vergangenheit habe ich 1 verwendet, aber wie wir alle wissen, skaliert es nicht gut. 2 ist in Ordnung, aber ich habe gemischte Gefühle, über einen Kunden technisch in der Lage, alle anderen einzufrieren. 3 klingt interessant (ein bisschen besser als 2), aber ich habe gehört, dass es nicht für zu viele Verbindungen geeignet ist. Also, was wäre der beste Weg (D)? Gibt es andere Möglichkeiten?
Der gängigste Ansatz ist 3 am ähnlichsten: asynchrone Programmierung mit einer leistungsfähigeren select
Alternative, wie die Systemaufrufe poll
oder epoll
unter Linux, IOCP unter Windows oder höherstufige Bibliotheken, die sie umhüllen. D unterstützt sie nicht direkt, aber Sie können D-Bindungen oder D-Bibliotheken von Drittanbietern (z. B. Tango) finden, die diese unterstützen.
Server mit höherer Leistung (z. B. nginx) verwenden einen Thread / Prozess pro CPU-Kern und verwenden in diesem Thread / Prozess asynchrone Ereignisbehandlung.
Eine Option, die in Betracht gezogen werden sollte, ist ein einzelner Thread, der den Befehl select / pol / epoll ausführt, aber die Ergebnisse nicht verarbeitet. Stattdessen stellt es Verbindungen her, von denen bekannt ist, dass sie Ergebnisse haben, und lässt einen Threadpool daraus füttern. Wenn Sie überprüfen, ob eine vollständige Anfrage eingelesen wurde, können Sie dies im Poll-Thread mit nicht blockierenden E / A tun und nur vollständige Anfragen in die Warteschlange stellen.
Ich weiß nicht, ob D irgendwelche Unterstützung bietet, abgesehen von (möglicherweise) Inter-Thread-Kommunikation und Warteschlangen.
Tags und Links sockets d network-programming d2