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?
Odpowiedz
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.
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!');
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
Użyłem do tego zewnętrznego serwera memcached lub redis.
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
To pasuje bardziej jako komentarz niż jako odpowiedź – renatoargh
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ć.
- 1. debugowania bezpański przechwycone wyjątki (ECONNRESET) w klastrze węzłów
- 2. Uzyskaj całkowitą liczbę węzłów i węzłów zliczających
- 3. Jak znaleźć wszystkie ścieżki przez zestaw danych węzłów w DAG?
- 4. Ograniczająca liczba węzłów
- 5. Usuwanie węzłów z XDocument
- 6. Usuwanie węzłów z XML
- 7. Jak wybrać wszystkie węzły podrzędne z wyjątkiem węzłów tekstowych?
- 8. d3: Unikać niezmienionych węzłów?
- 9. przeciąganie węzłów, gdy ich rodzic ma transformację, powoduje zniknięcie węzłów.
- 10. neo4j jak zwrócić wszystkie etykiety węzłów za pomocą Cypher?
- 11. Znajdowanie rekurencyjnie węzłów w XDocument
- 12. Powtórz wszystkie generacje węzłów XML w java DOM
- 13. Tworzenie klasy węzłów w Javie
- 14. Jak dołączyć do pliku hdfs w bardzo małym klastrze (3 lub mniej węzłów)
- 15. Limity węzłów DOM DOMU
- 16. Dodawanie węzłów do klastra usług sieci Web
- 17. Zapobieganie grafviz przestawiania węzłów
- 18. Liczba węzłów potomnych pugixml
- 19. Usuwanie węzłów indeksowanych w Neo4j
- 20. Jak zatrzymać ruch węzłów w Neo4j?
- 21. Liczba drzew, które można utworzyć przez usunięcie węzłów na wykresie
- 22. Wyszukiwanie drzewa opinającego, które minimalizuje sumę głębokości węzłów.
- 23. Ponowna kolejność węzłów potomnych w django-MPTT
- 24. Które elementy HTML nie mogą zawierać węzłów potomnych?
- 25. JTree: Zaznaczanie wszystkich węzłów programowo
- 26. Widok węzłów i ich tłumaczeń
- 27. Czy jest możliwe użycie różnych portów dla węzłów w klastrze Cassandra?
- 28. Dystrybucja węzłów danych w wielu centrach danych
- 29. Ustalanie kolejności dokumentów z węzłów
- 30. Etykiety węzłów za pomocą siecix
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ł. –
@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? –
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ą. –