Ich entwickle einen Multiplayer-Gaming-Server, der Django für den Webserver (HTML-Frontend, Benutzerauthentifizierung, Spiele verfügbar, Rangliste usw.) und Twisted verwendet, um Verbindungen zwischen den Spielern und den Spielen herzustellen und mit den Spielen selbst zu interagieren. Der Gameserver, der Webserver und die Datenbank können auf verschiedenen Rechnern laufen.
Was ist der "beste" Weg, die gemeinsam genutzte Datenbank so zu gestalten, dass Änderungen am Datenbankschema unterstützt werden? Sollte ich versuchen, Djangos ORM in das Twisted-Framework einzubauen und Deferred zu verwenden, um es nicht blockierend zu machen? Sollte ich stecken bleiben und zwei getrennte Datenbankschemas / Schnittstellen erstellen, eine in Djangos Modell und die andere mit twisted.enterprise.row?
Soll ich bei der Benutzerauthentifizierung die Benutzerauthentifizierungsfunktion von twisted verwenden oder versuchen, Django-Module in den Gameserver einzubinden, um die Benutzerauthentifizierung auf der Spieleseite zu handhaben?
Zuerst würde ich herausfinden, warum du sowohl Django als auch Twisted brauchst. Angenommen, Sie sind vertraut mit Twisted mit twisted.web und auth wird einfach ausreichen und Sie können Ihre Datenbank-Ebene für die Front-End-und Back-End-Anwendungen wiederverwenden.
Alternativ könntest du es auch anders sehen, was macht Twisted als Spielserver besser? Hoffen Sie, mehr Spieler (mehr gleichzeitige Verbindungen) oder etwas anderes zu unterstützen? Berücksichtigen Sie, dass Sie, wenn Sie Threads innerhalb von Twisted verwenden müssen, um den Datenbankzugriff zu blockieren, wahrscheinlich nicht in der Lage sind, Hunderte von simultanen Threads effizient / zuverlässig zu unterstützen. Denken Sie daran, dass Python über eine globale Interpretersperre verfügt, sodass Threads nicht unbedingt die beste Skalierungsmethode darstellen.
Sie sollten auch überlegen, warum Sie eine SQL-Datenbank und ein ORM verwenden möchten. Verfügt Ihr Spiel über Daten, die für die Speicherung in einer relationalen Datenbank am besten geeignet sind? Vielleicht lohnt es sich, etwas wie MongoDB oder eine andere Schlüsselwert- oder Objektdatenbank zum Speichern des Spielstatus zu untersuchen. Viele dieser NoSQL-Speicher verfügen sowohl über blockierende Treiber für die Verwendung in Django als auch über nicht blockierende Treiber für die Verwendung in Twisted (z. B. txmongo).
Wenn Sie also sowohl Django als auch Twisted verwenden, gibt es ein paar Techniken, um den DB-Zugriff in einen blockierungsfreien Twisted-Server einzubetten.
Sie sollten also in der Lage sein, die Django ORM-Objekte selbst zu verwalten, indem Sie sie in twisted importieren und sehr vorsichtig mit reactor.deferToThread telefonieren. Es gibt viele mögliche Probleme bei der Arbeit mit diesen Objekten innerhalb von twisted, da einige ORM-Objekte SQL ausgeben können, wenn sie auf eine Eigenschaft usw. zugreifen / diese setzen.
Ich weiß, dass dies nicht unbedingt die Antwort ist, die Sie erwartet haben, aber vielleicht mehr Details über das, was Sie erreichen wollen und warum Sie diese spezifischen Technologien wählen, werden die Leute bessere Antworten bekommen.
Ich würde nur das Django-ORM vermeiden, es ist nicht alles und es wäre ein Schmerz, außerhalb eines Django-Kontexts zuzugreifen (bezeugen Sie die Arbeit, die nötig war, damit Django mehrere Datenbanken unterstützt). Twisted-Datenbankzugriff erfordert immer Threads (sogar mit twisted.adbapi), und Threads geben Ihnen Zugriff auf jedes ORM, das Sie auswählen. SQLalchemy wäre eine gute Wahl.