2013-01-17 15 views
5

Szukałem i znalazłemCzy cursor.observe spowalnia działanie serwera?

_suppress_initial: true 

ale nie robi praca z 0,54

chcę obserwować jakąś kolekcję jak Collection Orders.

jeśli mam duże zamówienia i gdy dodano nowe zamówienie, które chcę zastosować, aby zaktualizować kolejną kolekcję.

Nie wprowadziłem obserwacji do Meteor'a. Opublikuj co, jeśli nie przestanę tego obserwować, czy to spowalnia serwer, co jeśli cały czas obserwuję go podczas pracy serwera?

if Meteor.isServer 

    obOrders = Orders.find({}).observe # when server restart does this slow down performance ? 

     _suppress_initial: true # doesnt work 

     added: (order) -> 

      console.log order # still add exist documents 

      if Date.now() - order.timestamp < 500 
       console.log order # update another one 

czy powinienem ograniczyć Orders.find {}, limit: 50 i sortować według timestampu, aby obserwować najnowsze dokumenty?

Aby umieścić serwer alerton Meteor.startup lub Meteor.publikować, co różni ten warunek?

jeśli umieściłem go w Meteor.startup oznacza to, że robię singleton obserwując?

+0

To samo tutaj, nie mogę uzyskać _suppress_initial do pracy dla mnie albo – matb33

Odpowiedz

6

Teraz, observe musi trwale przechowywać w pamięci wszystkie wyniki zapytania. Więc jeśli zadzwonisz pod numer Orders.observe({}), serwer będzie przechowywać całą kopię kolekcji Orders w pamięci tak długo, jak obserwacja jest uruchomiona. Dzieje się tak dlatego, że za sceną observe działa poprzez porównywanie starych wyników kwerend z nowymi wynikami zapytania po wykryciu potencjalnej zmiany. To jest pewne, że wyniki z observe są zawsze w 100% poprawne, nawet jeśli istnieją warunki wyścigu w wyniku kilku procesów zapisanych jednocześnie do bazy danych.

W ten sposób, jeśli wyszukujesz ograniczoną liczbę dokumentów, takich jak pięć ostatnich zamówień lub zamówień złożonych w ciągu ostatnich 5 minut, znacznie zmniejszy to użycie pamięci RAM (i prawdopodobnie użycie procesora). Ale jeśli to zrobisz to musisz być ostrożny, aby upewnić się, że nie przegapisz żadnych dokumentów. Na przykład, jeśli obserwujesz dokumenty, które zostały wstawione w ciągu ostatnich 5 minut, ale twój serwer przestaje działać przez 10 minut, możesz nie otrzymywać dodatkowych wiadomości dla niektórych zamówień. Lub, jeśli obserwujesz 5 ostatnich dokumentów, a następnie inny węzeł wstawia 1000 dokumentów naraz, możesz otrzymać tylko dodaną wiadomość dla ostatnich 5 wiadomości (ponieważ observe nie gwarantuje, że będziesz obserwował każdy stan pośredni, tylko że twoje komunikaty dodawania/usuwania/zmiany będą na bieżąco informować Cię o aktualnym stanie.)

Co do tego, od czego zacząłbyś taki obserwować: Jeśli zrobisz to z Meteor.startup na serwerze, to zawsze będzie działa, ale będzie tylko jedna kopia tego działa (na razie - w przyszłości Meteor uruchomi wiele procesów serwera i będziesz musiał zaktualizować swój kod.) Jeśli zrobisz to z obsługi publikowania, to będzie to tylko uruchom (i zużywaj zasoby) tylko wtedy, gdy jest co najmniej jedna subskrypcja. Ostatnie wydania Meteora usuwają duplikaty observe s, które są wywoływane dokładnie w tym samym zapytaniu, więc jeśli masz 1000 subskrypcji do obsługi publikowania, który wywołuje Orders.find ({}) .obserwuj ({...}), to nie powinno. ' t zużywają znacznie więcej zasobów, niż gdyby były tylko jeden. (Pamiętaj, aby przestać obserwować, gdy klient zrezygnuje z subskrypcji.)

W zależności od tego, co robisz, może być łatwiej zaplanować zadanie po utworzeniu każdego zamówienia niż użyć added.Na przykład możesz mieć metodę createOrder, która wstawia zamówienie, a także dodaje element do kolekcji ordersToProcess, a następnie oddzielnie posiada kod, który wyciąga elementy z kolekcji ordersToProcess i przetwarza je pojedynczo, a następnie usuwa je. Lub możesz po prostu wykonać przetwarzanie bezpośrednio z metody createOrder, jeśli nie zajmie to zbyt dużo czasu.

+1

Myślę, że wiele się zmieniło od czasu, kiedy napisałeś swoją odpowiedź. https://github.com/meteor/meteor/wiki/Oplog-Observe-Driver – HaNdTriX

Powiązane problemy