IPC in einer Multi-Prozess-Server

Einstiegsfragen, Mathematik, Physik, künstliche Intelligenz, Engine Design
Antworten
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

IPC in einer Multi-Prozess-Server

Beitrag von Halan »

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 :)
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4259
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: IPC in einer Multi-Prozess-Server

Beitrag von Chromanoid »

Tejio
Establishment
Beiträge: 107
Registriert: 11.11.2010, 11:33

Re: IPC in einer Multi-Prozess-Server

Beitrag von Tejio »

Ich weiß nicht, ob es in deine Richtung geht, aber wie wäre es mit MPI? Boost beinhaltet dazu eine passende Bibliothek.
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: IPC in einer Multi-Prozess-Server

Beitrag von eXile »

Darf ich hier gerade eine Geschichte zum besten geben? Als ich vor vier Jahren bei einer großen, deutschen Forschungsgemeinschaft mit grünem Logo gearbeitet habe, wurde auch CORBA mit ACE/TAO und SOAP eingesetzt. Für eine Roboterplattform. Mit drahtloser Kommunikation zu einem großen Server. Die Webcam-Daten wurden auf dem Server ausgewertet, und die Steuerungskommandos an den Roboter gesendet. (Vorsicht: Das war alles kein akademischer Qualität, d.h. alles zusammengekloppt damits bis zur Demo lief, und dann vergessen.)

Naja, nur leider hat irgendjemand die Kodierung nicht hinbekommen. Es wurde für das 640×480-Bild jeder einzelne Pixel via SOAP in XML kodiert. Also nach der Form <m:Pixel value="r">255</m:Pixel><m:Pixel value="g">128</m:Pixel><m:Pixel value="b">96</m:Pixel>. Für alle Pixel.

Der Roboter fuhr gegen die Wand.
Benutzeravatar
Lynxeye
Establishment
Beiträge: 145
Registriert: 27.02.2009, 16:50
Echter Name: Lucas
Wohnort: Hildesheim
Kontaktdaten:

Re: IPC in einer Multi-Prozess-Server

Beitrag von Lynxeye »

Wenn du den Server wirklich über mehrere Maschinen verteilen willst, kannst du Möglichkeit drei schon mal ausschließen. UnixDomain-Sockets funktionieren nur auf einer einzelnen Maschine.

DBus halte ich etwas übertrieben, vor allem da es viele Möglichkeiten bietet, die du bei deinem Spieleserver nicht brauchen wirst. Der Overhead davon ist wahrscheinlich zu groß.

Ich denke du solltest eher in die Richtung eines hierarchischen Systems gehen und pro Maschine einen zentralen IPC Prozess aufsetzen, der mit seinen Maschinenlokalen Prozessen über eine Low-Overhead Verbindung, wie UnixDOmain-Sockets oder Pipes redet und zu IPC Prozessen auf anderen Maschinen mittels eines verlässlichen Protokolls, wie TCP, verbindet.

Allerdings solltest du dich vorher noch einmal genau fragen, ob du diesen Aufwand wirklich betreiben willst. Musst du die Server wirklich über mehrere Maschinen verteilen? In Zeiten von 48 Kernen in einem zusammenhängenden NUMA-System sehe ich den Sinn dahinter nicht richtig. Vor allem, da derzeit eher der umgedrehte Weg gegangen wird und mehrere Server auf eine solche Maschine gelegt werden, da die vorhandene Leistung sonst nicht auszureizen ist.
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: IPC in einer Multi-Prozess-Server

Beitrag von Halan »

Lynxeye hat geschrieben:Allerdings solltest du dich vorher noch einmal genau fragen, ob du diesen Aufwand wirklich betreiben willst. Musst du die Server wirklich über mehrere Maschinen verteilen? In Zeiten von 48 Kernen in einem zusammenhängenden NUMA-System sehe ich den Sinn dahinter nicht richtig. Vor allem, da derzeit eher der umgedrehte Weg gegangen wird und mehrere Server auf eine solche Maschine gelegt werden, da die vorhandene Leistung sonst nicht auszureizen ist.
Sorry für das Missverständnis, natürlich war es so gemeint dass die Maschinen in einem Clustersytem laufen. In diesem Fall sollten die UnixSockets doch funktionieren oder?
Benutzeravatar
dv
Beiträge: 51
Registriert: 15.09.2002, 17:46
Benutzertext: Ugauga.
Alter Benutzername: dv
Wohnort: Südamerikanischer Dschungel
Kontaktdaten:

Re: IPC in einer Multi-Prozess-Server

Beitrag von dv »

Antworten