Golang: speichern/Zwischenspeichern der Werte wird im folgenden http-Anfragen
Ich Schreibe einige Gehen webservices (auch der Durchführung der webserver Gehen mit http.ListenAndServe).
Ich habe eine Karte von Strukturen, die möchte ich im Gedächtnis behalten (mit einer ungefähren Größe von 100Kb) verwendet werden, die von verschiedenen http-Anfragen.
Welches ist der beste Weg, um dieses Ziel zu erreichen Gehen?
Ihrer Erfahrung nach ist es besser, auf Globale package-Variablen oder caching-Systemen (wie memcache/groupcache)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zusätzlich zu den Antworten hast du bereits erhalten, erwägen Sie die Verwendung von Empfänger-Curry - Methode Werte und http.HandlerFunc.
Wenn Ihre Daten sind Daten, die geladen wird, bevor der Prozess beginnt, können Sie gehen mit etwas wie dieses:
Dies funktioniert gut, wenn alle
Common
-Daten schreibgeschützt sind. Wenn dieCommon
Daten Lesen/schreiben, dann werden Sie wollen etwas mehr haben wie:Der rest ist im Grunde das gleiche, nur das anstelle des Zugriffs auf die Daten durch die Empfänger-Felder direkt, Sie würde auf Sie über die Getter und setter. In einem webserver, wo die meisten Daten gelesen werden, werden Sie wahrscheinlich wollen eine RWMutex, so dass Lesevorgänge ausgeführt werden können, gleichzeitig mit einem anderen. Ein weiterer Vorteil des zweiten Ansatzes ist, dass Sie die gekapselten Daten, so dass Sie hinzufügen können in die transparente schreibt und/oder liest aus einem memcache oder eine groupcache, oder etwas, dass die Natur in der Zukunft, wenn Ihre Anwendung wächst eine solche Notwendigkeit.
Eine Sache, die ich wirklich mag über die Definition meiner Handler als Methoden auf einem Objekt ist, dass es macht es viel einfacher zu unit-testen Sie Sie: Sie können ganz einfach definieren eine Tabelle driven test, die die Werte enthält, die Sie möchten und die Ausgabe, die Sie erwarten, ohne zu mucken um mit globalen Variablen.
Die einfache Lösung, die immer noch das problem löst, ist in der Regel der richtige Ansatz. Zwischenspeichern von Daten, die lokal auf dem server ist sowohl einfach als auch effizient, und kann getan werden, in vielen Fällen sogar wenn ein reicher system verwendet wird.
Als Beispiel, letzten Monat habe ich einen schnellen hack live ( http://ubuntu-edge.info ), die nahm ein wenig von der Last aufgrund der Nachrichten um die Verbreitung der crowdfunding-Kampagne, und die Gehen Prozess hatte sehr niedriger Last die meiste Zeit in einem kleinen EC2-Maschine. Die Daten trivial und wurde nur im Arbeitsspeicher zwischengespeichert, aktualisiert sich einmal pro minute von der Datenbank, die aktualisiert wurde von einem externen Prozess.
Ich in der Regel Blick auf memcache (und jetzt groupcache), wenn es selbst zu tun, würde bedeuten, replizieren Sie mehr über Ihre Funktion. Zum Beispiel, wenn es zu viele Daten im Speicher zu behalten, oder, wenn Sie verlieren eine server möglicherweise Auswirkungen auf die performance des Gesamtsystems, da die zwischengespeicherten Daten sind alle auf einmal Weg sind, oder weil die Leistung beeinträchtigt wird, durch Streit.
Als eine Randnotiz, groupcache ist eigentlich eine Bibliothek, so dass Sie einbetten zu können in Ihrem server statt als eine tatsächliche externe system.
Nicht gönnen vorzeitige Optimierung. Definieren Sie eine Go-Paket-API zu Kapseln die Daten und können Sie ändern die Umsetzung jederzeit. Zum Beispiel, nur kritzeln,