Frage

Ich habe eine Server-Anwendung gemacht in Erlang. Darin habe ich einen Mnesia Tisch dass speichern einige Informationen über Fotos. Im Sinne von „alles ist ein Prozess“Ich entschied, dass in einer Tabelle gen_server Modul zu wickeln, so dass die gen_server Modul ist der einzige, der direkt auf die Tabelle zugreift. abfragt und das Hinzufügen von Informationen zu dieser Tabelle erfolgt durch Nachrichten an diesen Prozess zu senden (Das einen registrierten Namen). Die Idee ist, dass es mehrere Client sein wird Prozesse Informationen aus dieser Tabelle abzufragen.

Das funktioniert ganz gut, aber das gen_server Modul hat keinen Zustand. Alles es erfordert in der Mnesia Tabelle gespeichert. Also, ich frage mich, ob ein gen_server vielleicht nicht das beste Modell für die Tabelle Einkapseln?

Soll ich einfach kein Prozess machen, und stattdessen nur die Tabelle kapseln durch die Funktionen in diesem Modul? Im Fall eines Fehlers in diesem Modul, dass würde bewirken, dass der anrufende Prozess zum Absturz zu bringen, was ich denke, könnte besser sein, weil es würde nur einen einzigen Kunden beeinflussen, wie jetzt gegenüber, wenn es das würde dazu führen, gen_server Prozess zum Absturz zu bringen, jeden ohne auf den Tisch Zugang zu verlassen (bis der Supervisor startet es neu).

Jede Eingabe wird sehr geschätzt.

War es hilfreich?

Lösung

Ich denke, nach Rasiermesser Ockhams dort keine Notwendigkeit für diese gen_server , zumal es absolut kein Zustand in ihm gespeichert. Ein solches Verfahren könnte in Situationen erforderlich sein, wenn Sie den Zugriff auf die Tabelle (oder jede andere Ressource) müssen sein streng sequenziellen (zB Sie können keine abgebrochenen Transaktionen vermeiden wollen bei Kosten für einen Engpass).

Einkapseln Zugriff auf die Tabelle in einem Modul ist eine gute Lösung . Es schafft keine zusätzliche Komplexität , während der Bereitstellung richtige Abstraktionsebene und Verkapselung.

Andere Tipps

Ich bin mir nicht sicher, ob ich verstehe, warum Sie sich entschieden haben, eine Tabelle mit einem Prozess zu verkapseln. Mnesia soll über einen Cluster mehrere gleichzeitige Zugriffe auf Tabellen, sowohl lokal als auch verteilt zu vermitteln.

eine API-Modul erstellen, die all bestimmten Tabellenzugriffsoperationen und Updates durchführt, ist eine gute Idee, wie die API-Funktionen, um Ihre Absicht besser im Code vermitteln werden, die sie nennt. Es wird besser lesbar als setzen die Mnesia Operationen der anrufenden Code direkt in.

Ein API-Modul gibt Ihnen auch die Möglichkeit, von Mnesia zu einem anderen Speichersystem zu wechseln, wenn Sie später müssen. Mit Mnesia Transaktionen in Ihrem API-Modul schützt Sie vor einigen Programmierfehler als Mnesia Roll-Back wird, dass Crash-Operationen. Das API-Modul wird immer verfügbar sein, um Anrufer und ermöglicht eine beliebige Anzahl von Anrufern Operationen gleichzeitig durchzuführen, während ein gen_server basierter API einen Fehlerpunkt ist, wird der Prozess, der die API nicht verfügbar machen kann.

Das einzige, was ein gen_server basierte API Sie über eine reine Funktions API gibt, ist Zugriff auf die Tabelle zu serialisieren -., Die eine ungewöhnliche Anforderung ist, und wenn Sie speziell sie benötigen, wird es eine Performance-Killer

Es kann eine gute Idee sein, eine Mnesia Tabelle mit einzelnen gen_server Prozess zu handhaben, wenn Sie schmutzig Zugriff verwenden möchten, und Transaktionen zu vermeiden. Dieser Ansatz könnte sein, schneller als txs, aber in der Regel müssen Sie Benchmark es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top