2013-05-24 6 views
6

Morgen alleBester erlang In-Memory-Cache-System Kreuz Netzwerkknoten = Mnesia?

Ich bin neu zu Erlang, aber ich versuche mein erstes Projekt auf Erlang zu entwerfen, um so gut zu sein wie ich kann. Hier brauche ich einen Vorschlag für das Erlang In-Memory-Cache-System.

  1. Das Cache-Element ist ein Schlüsselwert-basierter Speicher. Schlüssel ist normalerweise eine ASCII-Zeichenfolge; value ist erlangs types include number/list/tuple/etc.
  2. Der Cache-Gegenstand kann von jedem Knoten gesetzt werden.
  3. Das Cache-Element kann von jedem Knoten abgerufen werden.
  4. Das Cache-Element ist über alle Knoten hinweg auch auf verschiedenen Servern freigegeben
  5. Dirty-Read ist erlaubt, ich möchte keine Sperre oder Transaktion, um die Leistung zu reduzieren.
  6. Total verteilt, keine zentrale Maschine oder Service.
  7. Gute Leistung
  8. Einfache Installation & Einsatz & Konfiguration & Wartung

Erste Wahl ist mnesia mir scheint, aber ich habe keine experence darauf. Erfüllt es meine Anforderung? Wie kann ich die Leistung erwarten?

Eine andere Option ist memcached - Aber ich fürchte, die Leistung ist niedriger als Mnesia, weil zusätzliche Serialisierung/Deserialisierung durchgeführt werden, da memcached Daemon von einem anderen Betriebssystem-Prozess ist.

Jeder Vorschlag ist Hilfe :)

Antwort

10

Ja. Mnesia erfüllt Ihre Anforderungen. Wie du schon sagtest, ein Werkzeug ist gut, wenn es von einem, der es benutzt, verstanden wird. Wir haben Mnesia auf einem distributed authentication system verwendet und wir haben bis jetzt kein Problem erfahren. Wenn mnesia als Cache verwendet wird, ist es besser als memcached, aus einem Grund kann "Memcached nicht garantieren, dass das, was Sie schreiben, jederzeit aufgrund von Speicherauslagerungsproblemen und anderem gelesen werden kann" (here).

Dies bedeutet jedoch, dass Ihr verteiltes System über Erlang aufgebaut wird. In der Tat schlägt Mnesia in Ihrem Fall die meisten NoSQL-Cache-Lösungen, weil ihre Systeme Eventually consistent sind. Mnesia ist konsistent, solange die Netzwerkverfügbarkeit im gesamten Cluster gewährleistet ist. Für ein verteiltes Cache-System wollen Sie keine Situation, in der Sie verschiedene Werte für den gleichen Schlüssel von verschiedenen Knoten lesen, daher ist die Konsistenz von mnesia hier hilfreich.

Etwas, worüber Sie nachdenken sollten, ist, dass es möglich ist, einen zentralen Speicher-Cache für ein verteiltes System zu haben. Dies funktioniert folgendermaßen: Sie haben einen RABBITMQ Server, auf dem AMQP-Clients auf jedem Cluster-Knoten ausgeführt werden und auf den sie zugreifen können. Systeme interagieren über die AMQP-Schnittstelle. Da der Cache zentralisiert ist, wird die Konsistenz durch den Prozess/das System sichergestellt, der für das Schreiben und Lesen aus dem Cache verantwortlich ist. Die anderen Systeme geben nur eine Anforderung für einen Schlüssel an die AMQP message bus, und das System, das für den Cache verantwortlich ist, empfängt diese Nachricht und antwortet mit dem Wert.

Wir haben das Message bus Architecture using RABBITMQ für ein neues System verwendet, das die Integration mit Banksystemen, einem ERP-System und einem öffentlichen Onlinedienst umfasst. Was wir gebaut haben, war verantwortlich für die Verschmelzung all dieser zusammen und wir sind froh, dass wir RABBITMQ verwendet haben.Die Details sind zahlreich, aber wir haben ein Nachrichtenformat und einen Systemidentifikationsmechanismus entwickelt. Alle Systeme müssen über einen RABBITMQ-Client zum Schreiben und Lesen vom Nachrichtenbus verfügen. Dann würden Sie für jedes System einen Wert Queue erstellen, so dass andere Systeme ihre Anforderungen in diese Warteschlange schreiben, deren Name innerhalb von RABBITMQ dem System entspricht, das sie besitzt. Dann müssen Sie später die Nachrichten verschlüsseln, die über den Bus übertragen werden. Am Ende haben Sie Systeme, die über große Entfernungen/Zustände miteinander verbunden sind, aber mit einem effizienten Netzwerk werden Sie nicht glauben, wie schnell RABBITMQ diese Systeme bindet. Anyway, RABBITMQ kann auch gruppiert werden, und ich sollte Ihnen sagen, dass es Mnesia ist, die RABBITMQ (das sagt Ihnen, wie gut Mnesia sein kann).

Eine andere Sache ist, dass Sie einige lesen und viele Programme schreiben sollten, bis Sie damit vertraut sind.

+0

Danke für Ihren ausführlichen Vorschlag. Ich bevorzuge eine Art lokale In-Memory-Cache-Lösung anstelle eines zentralisierten Cache-Systems. Zentralisiertes Cachesystem bedeutet, dass es eine Netzwerkkommunikationsverzögerung und zusätzliche Kosten zum Serialisieren/Deserialisieren des Objekts von/zu der gespeicherten Binärdatei oder Zeichenfolge gibt. In meiner Situation habe ich viele kleine Cache-Elemente und innerhalb einer HTTP-Anfrage kann ich bis zu einhundert Elemente abfragen, aber nicht in einem Batch. In diesem Fall scheint ein zentralisiertes Cachesystem für mich nicht geeignet zu sein. Verfügt Mnesia über einen lokalen Cache, um zu verhindern, dass der Cache immer von anderen Rechnern angefordert wird? –

+0

Ja. Wenn jeder Knoten eine Mnesien-Kopie der gleichen Datenbank hat, ist die Konsistenz clusterweit. Immer. Zu jedem Zeitpunkt ist das, was Sie von einem Cluster-Knoten lesen, derselbe wo. Dies hat jedoch Annahmen über die Netzwerkverfügbarkeit und die Verfügbarkeit von Mnesia auf allen Knoten, die an dem verteilten System teilnehmen. –