2013-05-17 11 views
8

Ich entwickle eine node.js App und ich brauche starke Redis-Nutzung. Die App wird cluster ed über 8 CPU-Kernen sein.Sollte ich Redis-Verbindung zwischen Dateien/Modulen teilen?

Momentan habe ich 100 gleichzeitige Verbindungen zu Redis, weil jeder Arbeiter pro CPU mehrere Module hat, die require('redis').createClient() laufen.

Szenario A:

file1.js:

var redis = require('redis').createClient(); 

file2.js

var redis = require('redis').createClient(); 

Szenario B:

redis.js

var redis = require('redis').createClient(); 

module.exports = redis; 

file1.js

var redis = require('./redis'); 

file2.js

var redis = require('./redis'); 

Welcher Ansatz ist besser: in jeder neuen Datei neu Redis Instanz I (Szenario A einführen) oder erstellen Sie eine globale Redis-Verbindung (Szenario B) und teilen Sie diese Verbindung über alle Module habe ich. Was sind die Nachteile/Vorteile jeder Lösung?

Vielen Dank im Voraus!

+0

vielleicht ein Verbindungspool würde Ihnen beide der beiden Szenarien geben? – akonsu

+0

@akonsu können Sie bitte ein Beispiel für diesen Verbindungspool geben – PirateApp

Antwort

1

Sowohl Node als auch Redis können viele Verbindungen ziemlich gut verarbeiten, also ist das kein Problem.

In Ihrer Situation erstellen Sie Redis-Verbindungen beim Start Ihrer Anwendung, so dass die Anzahl der Verbindungen, die Sie einrichten, begrenzt ist (in dem Sinne, dass nach dem Start Ihrer Anwendung die Anzahl der Verbindungen sein wird) Konstante).

Situationen, in denen Sie dieselbe Verbindung wiederverwenden möchten, befinden sich in sehr dynamischen Situationen, z. B. bei einem HTTP-Server, bei dem Sie Redis für jede Anforderung abfragen müssen. Das Erstellen einer neuen Verbindung für jede Anforderung wäre eine Verschwendung von Ressourcen (Verbindungen werden ständig erstellt und zerstört) und die Wiederverwendung einer Verbindung für jede Anforderung wäre vorzuziehen.

Für welche der beiden Szenarien würde ich bevorzugen, ich bin selbst auf Szenario A gelehnt.

+0

das ist ein guter Punkt, aber wenn Sie Ihre Knoteninstanz auf 10 laufende Instanzen skalieren und jede Instanz hat 2 Verbindungen, erstellen Sie 20 Verbindungen, der Ansatz A wird ineffizient sein während Skalierung – PirateApp

+1

@PirateApp unter der Annahme, dass alle diese Verbindungen verwendet werden, warum wäre es ineffizient? :) – robertklep

+0

das ist warum :) https://medium.com/@stockholmux/managing-modularity-and-redis-connections-in-node-js-eb9232f8c1ba – PirateApp

3

Wenn ich eine Frage wie diese stelle, denke ich allgemein über drei grundlegende Fragen nach.

  1. Was ist besser lesbar?
  2. Welche ermöglicht eine bessere Wiederverwendung von Code?
  3. Was ist effizienter?

Nicht unbedingt in dieser Reihenfolge, wie sie auf dem Szenario ab, aber ich glaube, in diesem Fall alle drei dieser Fragen für Option B sind Wenn Sie jemals für create ändern Optionen benötigt, würden Sie dann müssen sie in jeder Datei bearbeiten, die sie verwendet. In Option A ist jede Datei, die redis verwendet, und Option B ist nur redis.js. Auch wenn ein neueres oder anderes Produkt herauskommt und Sie redis ersetzen möchten, wäre es machbar, redis.js als Wrapper für ein anderes Paket oder sogar einen neueren Redis-Client zu verwenden, der die Konvertierungszeit erheblich verkürzt.

Globals sind im Allgemeinen eine schlechte Sache, aber in diesem Beispiel sollte redis.js keinen veränderbaren Zustand speichern, daher gibt es kein Problem mit einem Global/Singleton in diesem Kontext.

Verwandte Themen