Wie können eingehende Nachrichten am besten behandelt werden?

8

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:

  1. 1 Thread / Verbindung (blockierend)
  2. Erstellen Sie eine Liste von Clients und durchlaufen Sie sie (nicht blockierend)
  3. Auswählen (Grundsätzlich eine blockierende Anweisung für alle Clients gleichzeitig mit optionaler Zeitüberschreitung?)

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?

    
Mars 26.01.2012, 21:57
quelle

2 Antworten

5

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.

    
Vladimir Panteleev 26.01.2012, 22:06
quelle
1

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.

    
BCS 27.01.2012 03:06
quelle

Tags und Links