Gen_server verwenden, um eine Mnesiatabelle einzukapseln?

8

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.

    
Erik Edin 17.09.2009, 08:28
quelle

3 Antworten

9

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.

    
gleber 17.09.2009, 09:16
quelle
6

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.

    
archaelus 17.09.2009 15:59
quelle
0

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.

    
Timm_Taylor 21.05.2014 12:02
quelle

Tags und Links