IPC in einer Multi-Prozess-Server
Verfasst: 25.04.2011, 16:40
Ahoi,
mal wieder eine kleine Frage von meiner Seite. Ich bastel schon seit längerer Zeit an einer Server-Architektur für ein kleines Onlinespiel, dabei geht es mir aber wirklich eher um den technischen Hintergrund und den Aufbau eines Servers der auch über mehrere Prozessoren/Maschinen skalierbar ist.
Mein Server besteht also aus mehreren Prozessen die über einen Routerprozess mit dem Client kommunizieren. Ich würde nun gerne einen einfachen Weg einführen wie sich die Prozesse untereinander benachrichtigen können. Hier sollte angemerkt sein, dass nicht alle mit dem Routerprozess verbunden sind und dieser sowieso nicht dafür verwendet werden soll weil er so schlank wie möglich gehalten werden soll (ist ja quasi der Flaschenhals meiner Architektur). Die Nachrichten werden meistens eher nur kurze Benachrichtigungen sein wie zum Beispiel "Spieler xy hat Zone gewechselt" oder "Neue Nachricht in Chatraum xy". Um an die eigentlichen Daten zu kommen sollen die Prozesse auf die Datenbank zugreifen.
Ich brauche habe mir dafür drei Möglichkeiten ausgedacht und hätte dazu einige Fragen beziehungsweise würde gerne eure Meinung dazu hören.
1. Ich benutze D-Bus
D-Bus wird ja heutzutage sowieso von jeder Linuxdistro verwendet und ist der normale Weg für IPC unter Desktopapps. Habe da aber einige bedenken, vor allem das Objektmodell in D-Bus scheint mir ein bisschen zu komplex für ein Spiele-Server.
2. Ich schreibe einen eigenen IPC-Server/Prozess
Von mir der bevorzugte Weg. Damit könnte ich leicht eigene Methoden einführen wie "Benachrichtige alle Zonen-Server". Problem dabei ist aber wie bei DBus, dass ein extra Overhead durch den IPC-Prozess entstehen würde.
3. Ich benutze UnixDomain-Sockets
Dazu habe ich eine generell Frage. UnixDomain-Sockets unterstützen ja DATAGRAM-Streams also verbindungslosen Datenverkehr. Wäre für mich sehr praktisch da ich ziemlich viele Prozesse laufen habe und ich nicht jeden mit jedem verbinden lassen will, was ja fast einen größeren Overhead erzeugen würde als ein dedizierter IPC-Prozess. Ich würde hier aber gerne von euch wisse, ob dieses DATAGRAM-Streams verlustfrei sind. Bei UDP ist das ja nicht der Fall, aber bei Unix Sockets gehen die Nachrichten ja nicht übers Netz sonder nur über den Kernel und er sollte ja eigentlich meine Daten nicht verlieren.
Naja jetzt hab ich schonmal viel geschrieben, ich freue mich auf eine angeregte Diskussion :)
mal wieder eine kleine Frage von meiner Seite. Ich bastel schon seit längerer Zeit an einer Server-Architektur für ein kleines Onlinespiel, dabei geht es mir aber wirklich eher um den technischen Hintergrund und den Aufbau eines Servers der auch über mehrere Prozessoren/Maschinen skalierbar ist.
Mein Server besteht also aus mehreren Prozessen die über einen Routerprozess mit dem Client kommunizieren. Ich würde nun gerne einen einfachen Weg einführen wie sich die Prozesse untereinander benachrichtigen können. Hier sollte angemerkt sein, dass nicht alle mit dem Routerprozess verbunden sind und dieser sowieso nicht dafür verwendet werden soll weil er so schlank wie möglich gehalten werden soll (ist ja quasi der Flaschenhals meiner Architektur). Die Nachrichten werden meistens eher nur kurze Benachrichtigungen sein wie zum Beispiel "Spieler xy hat Zone gewechselt" oder "Neue Nachricht in Chatraum xy". Um an die eigentlichen Daten zu kommen sollen die Prozesse auf die Datenbank zugreifen.
Ich brauche habe mir dafür drei Möglichkeiten ausgedacht und hätte dazu einige Fragen beziehungsweise würde gerne eure Meinung dazu hören.
1. Ich benutze D-Bus
D-Bus wird ja heutzutage sowieso von jeder Linuxdistro verwendet und ist der normale Weg für IPC unter Desktopapps. Habe da aber einige bedenken, vor allem das Objektmodell in D-Bus scheint mir ein bisschen zu komplex für ein Spiele-Server.
2. Ich schreibe einen eigenen IPC-Server/Prozess
Von mir der bevorzugte Weg. Damit könnte ich leicht eigene Methoden einführen wie "Benachrichtige alle Zonen-Server". Problem dabei ist aber wie bei DBus, dass ein extra Overhead durch den IPC-Prozess entstehen würde.
3. Ich benutze UnixDomain-Sockets
Dazu habe ich eine generell Frage. UnixDomain-Sockets unterstützen ja DATAGRAM-Streams also verbindungslosen Datenverkehr. Wäre für mich sehr praktisch da ich ziemlich viele Prozesse laufen habe und ich nicht jeden mit jedem verbinden lassen will, was ja fast einen größeren Overhead erzeugen würde als ein dedizierter IPC-Prozess. Ich würde hier aber gerne von euch wisse, ob dieses DATAGRAM-Streams verlustfrei sind. Bei UDP ist das ja nicht der Fall, aber bei Unix Sockets gehen die Nachrichten ja nicht übers Netz sonder nur über den Kernel und er sollte ja eigentlich meine Daten nicht verlieren.
Naja jetzt hab ich schonmal viel geschrieben, ich freue mich auf eine angeregte Diskussion :)