2013-02-12 10 views
16

Wygląda na to, że wszystkie procesy węzłów węzła działają tak, jakby wykonywały nową kopię tej samej aplikacji. Ale chciałby zachować niektóre zmienne, które są współużytkowane przez wszystkich pracowników węzła (procesy potomne) w klastrze węzłów. Czy istnieje prosty sposób na zrobienie tego?jak zachować zmienne, które współdzielą wszystkie procesy węzłów w klastrze węzłów?

+2

Czy przejrzałeś bazę danych, taką jak Redis? Nawet jeśli istnieje sposób, bez odpowiednich mechanizmów blokujących brzmi to jak zły pomysł. –

+0

@Aaron Dufour dzięki za odpowiedź. tak. redis jest jedną z opcji. Myślałem też o tym. Ale czy nie mogę tego zrobić bez korzystania z bazy danych? –

+1

Nie sądzę, że taka metoda istnieje. Na pewno możesz coś wymyślić, na przykład używając 'process.send' i' worker.send' (zobacz 'cluster' docs), ale nie byłoby to ani bezpieczne, ani szybkie. Przejściowy magazyn danych, taki jak Redis, jest zdecydowanie najlepszą opcją. –

Odpowiedz

14

Wszystkie procesy robocze są rzeczywiście nowymi kopiami Twojej aplikacji. Każdy pracownik to w pełni funkcjonalny proces utworzony za pomocą child_process.spawn. Więc nie, nie udostępniają zmiennych. I to chyba najlepiej w ten sposób. Jeśli chcesz udostępnić informacje między procesami roboczymi (zazwyczaj sesjami), powinieneś zajrzeć do przechowywania tych informacji w bazie danych.

Jeśli jesteś gotowy do pracy w węźle, możesz użyć czegoś takiego, jak dnode, aby prosiły pracowników o podstawowy proces przesyłania danych.

+0

Łącze dnode przechodzi do strony "Plik nie znaleziony" strona – zavg

+1

dzięki, sprawiłem, że teraz wskazuje na repozytorium github. – Floby

+0

Potrzebuję przekazywać media potoków (instancji obiektów), których nie mogę zrobić z redis lub magazynu wartości klucza: | – Antoine

12

Można próbować komunikować się między procesem nadrzędnym a procesami podrzędnymi. Na przykład:

skrypt test.master.js:

var cluster = require('cluster'); 
var childScript = __dirname + '/test.child.js'; 

cluster.setupMaster({ exec: childScript }); 

proc = cluster.fork(); 
proc.on('message', function(message) { 
    console.log('message from child: ', message); 
    proc.send('Hello from master!'); 
}); 

skrypt test.child.js:

console.log('Child initializing..'); 

process.on('message', function(message) { 
    console.log('message from master: ', message); 
}); 

process.send('Hello from Child!'); 
2

Myślę, że cała idea klastra jest o przypadki, które mogą pracować niezależnie od inny procesor. Dzielenie się pamięcią (zmienną globalną), do której mają dostęp i które zmieniają, wprowadza większą złożoność (blokady, itp.) I sprawia, że ​​te instancje są od siebie zależne.

Zewnętrzna baza danych byłaby dobrym rozwiązaniem, ponieważ zajmuje się wszystkimi problemami z dostępem do danych, ale najprawdopodobniej obniża wydajność.

Wiadomości to lepszy pomysł. Możesz przechowywać lokalne instancje var w swoich klastrach. Gdy klaster aktualizuje wartość, wyślij wiadomość do reszty z nich i zaktualizuj wartość. Jest to świetne, ponieważ jest asynchroniczne i nie blokuje się, ale ponownie aktualizacja wartości nie będzie natychmiast odzwierciedlana.

Co na ten temat: przechowuj zmienne w bazie danych i za każdym razem, gdy następuje zmiana wartości, powiadamiaj instancje. Mogą przechowywać nowe wartości w lokalnych zmiennych i wykonywać wywołania db tylko wtedy, gdy jest to potrzebne

4

Użyłem do tego zewnętrznego serwera memcached lub redis.

+1

Czy możesz podzielić się przykładem? próbuję pobrać zestaw danych z potomka w memcache, aby pobrać z mastera, ale nie działa – mithra

+0

To pasuje bardziej jako komentarz niż jako odpowiedź – renatoargh

0

Jeśli chcesz udostępniać rzeczy w trybie tylko do odczytu, sprawdź numer mmap-object. Używam go do dużych tabel wyszukiwania w pamięci.

Sprawdzanie właśnie teraz na serwerze, plik 346M zajmuje łącznie 156M pamięci (strony tylko w mmap w dostępie) i obiekt mmap dzielą go wśród 44 procesów dla narzutów procesu na poziomie 3,5M.

Ponieważ jest to plik tylko do odczytu, nie muszę się martwić blokowaniem między procesami i niechęcią, która może się przydać.

Powiązane problemy