Ich habe eine Serveranwendung in Erlang gemacht. Darin habe ich eine Mnesiatabelle
die einige Informationen auf Fotos speichern. Im Geiste von "alles ist a
Prozess "Ich entschied, diese Tabelle in ein gen_server
-Modul zu schreiben, so dass die
gen_server
Modul ist der einzige, der direkt auf die Tabelle zugreift. Abfrage
und Hinzufügen von Informationen zu dieser Tabelle erfolgt durch Senden von Nachrichten an diesen Prozess
(die einen registrierten Namen hat). Die Idee ist, dass es mehrere Kunden geben wird
verarbeitet die Abfrage von Informationen aus dieser Tabelle.
Das funktioniert gut, aber das Modul gen_server
hat keinen Status. Alles was es ist
requires wird in der mnesiatabelle gespeichert. Also, ich frage mich, ob ein gen_server
vielleicht ist
nicht das beste Modell zum Einkapseln dieser Tabelle?
Soll ich es einfach nicht zu einem Prozess machen und stattdessen nur die Tabelle einkapseln
durch die Funktionen in diesem Modul? Im Falle eines Fehlers in diesem Modul, das
würde den aufrufenden Prozess zum Absturz bringen, was ich denke, könnte besser sein, denn
es würde nur einen einzelnen Client betreffen, im Gegensatz zu jetzt, wenn es den. verursachen würde
gen_server
Prozess zum Absturz, alle ohne Zugriff auf die Tabelle (bis
der Supervisor startet es neu).
Jede Eingabe wird sehr geschätzt.
Ich denke, nach Ockhams Rasiermesser gibt es keine Notwendigkeit dafür gen_server
zu existieren , besonders da absolut no state darin gespeichert ist. Ein solcher Prozess kann in Situationen erforderlich sein, in denen Sie Zugriff auf die Tabelle (oder eine andere Ressource) benötigen, um strikt sequenziell zu sein (z. B. möchten möglicherweise abgebrochene Transaktionen vermeiden) Kosten eines Engpasses).
Das Einkapseln des Zugriffs auf die Tabelle in einem -Modul ist eine gute Lösung . Es erzeugt keine zusätzliche Komplexität und bietet gleichzeitig eine Ebene für Abstraktion und Kapselung.
Ich bin mir nicht sicher, ob ich verstehe, warum Sie sich entschieden haben, eine Tabelle mit einem Prozess zu kapseln. Mnesia wurde entwickelt, um mehrere gleichzeitige Zugriffe auf Tabellen sowohl lokal als auch verteilt über einen Cluster zu vermitteln.
Das Erstellen eines API-Moduls, das alle bestimmten Tabellenzugriffsoperationen und Aktualisierungen durchführt, ist eine gute Idee, da die API-Funktionen Ihre Absicht in dem Code, der sie aufruft, besser vermitteln. Es wird lesbarer sein, als die Mnesien-Operationen direkt in den aufrufenden Code zu schreiben.
Ein API-Modul bietet Ihnen auch die Möglichkeit, später bei Bedarf von mnesia zu einem anderen Speichersystem zu wechseln. Die Verwendung von Mnesia-Transaktionen in Ihrem API-Modul schützt Sie vor einigen Programmierfehlern, da Mnesien Rollback-Vorgänge, die abstürzen, rückgängig macht. Das API-Modul ist immer für Anrufer verfügbar und ermöglicht es einer beliebigen Anzahl von Anrufern, Vorgänge gleichzeitig auszuführen, während eine gen_server-basierte API einen Fehlerpunkt hat, den Prozess, der die API nicht verfügbar machen kann.
Das einzige, was eine gen_server-basierte API über eine rein funktionale API bietet, ist die Serialisierung des Zugriffs auf die Tabelle - was eine ungewöhnliche Anforderung ist und, wenn Sie sie nicht ausdrücklich benötigen, ein Performance-Killer sein wird.
Es kann eine gute Idee sein, eine mnesia-Tabelle mit dem einzelnen gen_server-Prozess zu verarbeiten, wenn Sie einen schmutzigen Zugriff verwenden und Transaktionen vermeiden möchten. Dieser Ansatz ist möglicherweise schneller als txs, aber normalerweise müssen Sie ihn vergleichen.