2016-03-22 5 views
1

Ich habe einen bestimmten Anwendungsfall für mehrere in Speicherschlüssel Wert Karten, die sehr schnelle Nachschlagezeit benötigen. Sie werden nur einmal am Tag gesetzt und können daher für alle praktischen Zwecke als unveränderlich betrachtet werden. Redis ist keine Option, da CPU-gedrosselt wird, wenn mehrere Threads darauf zugreifen. Multiinstanz-Redis nimmt aufgrund der Datenreplikation zu viel Speicher auf. Die wichtige Sache, die hier zu beachten ist, ist, dass die Leserate in Bursts sehr hoch ist. Etwa 10 Millionen Anfragen in Bursts von ungefähr 40-50 Arbeitern gleichzeitig.Schreiben Sie einmal viele im Speicher Schlüssel Wert speichern

Ich dachte daran, eine einfache Client-Server-Architektur mit mehreren Lesegeräten zu erstellen, die sich mit einem Server verbinden, um von gemeinsam genutzten Speicherkarten zu lesen. Ich frage mich jedoch, ob eine solche Architektur bereits existiert und für diesen Anwendungsfall gründlich getestet wurde. In diesem Fall sollte ich das Rad nicht neu erfinden.

Also zusammenzufassen, was ist meine beste Alternative? TIA.

Antwort

0

Vielleicht nicht für Sie geeignet, aber Sie könnten RBLDNSD versuchen und Ihre Werte in DNS speichern. Es ist eine hohe Leistung und die Ergebnisse werden zwischengespeichert, und es ist einfach, die Werte aus so ziemlich jeder Programmierumgebung zu lesen. Um Werte zu schreiben, müssen Sie direkt in seine Zonendateien schreiben, aber das Format ist einfach und leicht zu schreiben.

+0

Wird es auschecken, obwohl ich denke, dass dies nicht die richtige Verwendung für dieses Framework ist. – Sohaib

0

Sie erwähnen nicht die Größe Ihrer Karten, aber da die Leistung so wichtig ist, klingt es vielleicht so, als ob Sie möglicherweise Kopien Ihrer "multiple in memory key value maps" mit jedem Arbeiter in Betracht ziehen.

Sie könnten dann einen einfachen Mechanismus implementieren, um jeden Worker zu benachrichtigen, dass es Zeit ist, seine Maps zu aktualisieren (z. B. Redis PUBLISH oder ein anderes Pubsub-Framework).

+0

Kartengrößen reichen von ein paar tausend bis etwa 20 Millionen Einträge in der größten Karte. Der Gesamtspeicherbedarf im Fall von redis beträgt etwa 9 GB. Ich habe nicht so viel Arbeitsspeicher auf jedem Arbeiter. Die Arbeiter führen Funkenjobs, die selbst sehr speicherintensiv sind. – Sohaib

+0

Benötigen alle Mitarbeiter Zugriff auf alle Daten? Können Sie das Dataset so partitionieren, dass jeder Worker nur die * Chunks * benötigt? Wenn Sie einem Mitarbeiter eine Aufgabe zuweisen, können Sie Mitarbeiter bevorzugen, die bereits mit einer ähnlichen Aufgabe gearbeitet haben? Können Sie einen In-Memory-Cache für Hot-Daten verwenden und Redis als langsameren Netzwerk-Cache verwenden, ähnlich wie [stackoverflow.com] (http://meta.stackexchange.com/questions/69164/does-stack-exchange-use) -caching-und-wenn-wie-wie) –

+0

Kartenzugriff ist ziemlich zufällig. Ich glaube nicht, dass ich darauf basierend partitionieren kann. Allerdings haben Sie den Hot-Cache-Mechanismus erwähnt, den ich bisher noch nicht ausprobiert habe, hauptsächlich weil ich nicht weiß, wie viele sich wiederholende Abfragen es gibt. Meine Vermutung war, dass die Wiederholung gering ist, aber ich könnte falsch liegen. – Sohaib

0

Auf die Gefahr hin, mit der Stackoverlow Selbstförderung Polizei zu gehen :-) eXtremeDB könnte eine Überlegung sein. Es ist nicht schemalos, aber Ihr Schema kann einfach ein Schlüssel/Wert-Paar definieren. Es unterstützt MVCC (optimistische, nicht blockierende) Parallelität, so dass selbst die relativ seltenen Schreibvorgänge den Lesern nicht in die Quere kommen und Sie alle CPU-Kerne nutzen können.

+0

Ist das Open Source? – Sohaib

+0

@Sohaib Sieht nicht so aus, als wäre es Open Source. – Eborbob

+0

Richtig, es ist keine Open Source, obwohl eine Quellcode Lizenz eine Option ist. –

Verwandte Themen