2013-02-20 7 views
19

Przebaczam moją ignorancję, ale pochodząc z tła Django/Python, widzę ogromną zaletę, że kolejka Selera działa przez wolniejsze procesy w tle, podczas gdy interfejs sieciowy jest aktualizowany tak szybko, jak to możliwe.Węzły pracowników JS - jakiejkolwiek potrzeby?

Jednak w przypadku węzła działającego asynchronicznie, czy przypadek użycia systemu kolejki zmniejszył się znacznie?

Na przykład:

1 - posty użytkownika coś na miejscu, 2 - strona odpowiada, następnie maili z administratorem.

W Django, wyślesz pocztę administratora do zadania, które zostanie wykonane później, a następnie odpowie na żądanie. Seler wysyła pocztę w tle.

Węzeł wywołuje swój program pocztowy, a następnie odpowiada na żądanie. Program pocztowy wysyła następnie wywołanie zwrotne, aby powiedzieć "ZROBIONY, czy nie", do którego punktu użytkownik przegląda już odpowiedź.

Dlaczego więc miałbym używać kolejki z węzłem? Zgaduję, że rzeczy są bardziej złożone niż to - wydaje się, że w przypadku banalnych rzeczy, takich jak maile transakcyjne, nie jest to konieczne ..

Czy nie rozumiem, jak to działa !?

Odpowiedz

7

Masz rację, kontynuacje są całkiem miłe w węźle i jeśli wszystko uruchamiasz w jednym procesie węzłowym, nie ma potrzeby natychmiastowej kolejki. Jednak ponieważ węzeł jest węzłem pojedynczym, węzeł nie będzie w stanie obsłużyć żadnych nowych przychodzących żądań, gdy jest zajęty wysyłaniem tego e-maila lub przetwarzaniem tego zadania (jeśli jest to intensywne zadanie procesora)

Więc jeśli twoje zadania wymagają trochę czasu do przetwarzania procesora mądry, może nadal warto za pomocą zewnętrznej kolejki i oddzielny proces do obsługi tych zadań/wiadomości. Jeśli twoje zadania są bardzo intensywne i wymagają trochę czasu, ponieważ czekają na odpowiedzi z innych serwerów, to znowu nie ma potrzeby, ponieważ węzeł radzi sobie dobrze z io.

Jeśli masz zadanie intensywne procesora, ale nie chcesz wdrażać kolejki, możesz po prostu utworzyć więcej procesów węzłowych i instancji maszyny i zrównoważyć obciążenie, umożliwiając im przetwarzanie tych zadań. Wadą tego podejścia byłoby to, że nie można skalować strony i przetwarzania w tle oddzielnie. (np. 5 wystąpień dotyczących żądań internetowych i 2 instancji pracowniczych)

+1

Więc jeśli chcę zrobić coś takiego, jak wywołać zewnętrzny interfejs API, aby wyposażyć użytkowników informacje - np. wykonaj geokodowanie odwrotne za pomocą wywołania żądania do geokodera Google'a. To żądanie nie zatrzymałoby mojego procesu węzła dla następującego żądania przychodzącego? Ale gdyby było dużo użycia procesora, to ...? –

+1

Musisz to porównać, ale tak. To z grubsza taki pomysł. Zajrzyj tutaj, aby dowiedzieć się, ile można zrobić, czekając na operację io: http://www.eecs.berkeley.edu/~rcs/research/interactive_latency.html. Węzeł wykonuje tylko jedną rzecz naraz, więc jeśli jest to liczba, która nie działa, nie może obsługiwać żądań.Jak tylko wykonasz dowolną rzecz, uwolnisz węzeł i wykonasz inne czynności. – AndyD

+3

Przeformowanie dla (marginalnej) klarowności: jeśli wykonanie równoległe wymaga dużej ilości czekania na żądanie HTTP lub żądania systemu plików, to wbudowane asynchroniczne operacje we/wy węzła będą dla ciebie wystarczająco równoległe. Jeśli twoja równoległa implementacja wymaga lokalnego wykonywania dużych obliczeń (transkodowanie wideo, uruchamianie symulacji), to jednolita natura węzła utknie i będziesz musiał wykuć pracę do pracownika, jeśli to możliwe. – Dave

4

Nie, zawsze istnieją przypadki użycia kolejek, nawet w świecie węzłów. Podstawowym podejściem, które widziałem dla wielu osób z różnym skutkiem, jest używanie kolejki wycofanej w usłudze Redis do przechowywania wiadomości lub zadań. Być może jeden proces węzła dodaje elementy do kolejki, a inna instancja węzła przetwarza elementy z kolejki. Ponadto spójrz na listę modułów węzłów dla queue modules, a zobaczysz przyzwoitą liczbę implementacji.

+0

Rozumiem. Pomyślałem, że musi istnieć powód, dla którego było wiele implementacji kolejki, powiedziałem, że myślałem, że przypadek użycia został zmniejszony, a nie zupełnie zniknął ... –