2013-03-14 7 views
19

Chciałbym uruchomić pewne regularne zadania niezależne od klienta w tle aplikacji Meteor (jak skrobanie niektórych stron). Nie powinny one znajdować się w wątku klienta, ale gdy już się skończą, chciałbym zaktualizować wszystkich klientów informacjami. Jaki jest najlepszy sposób, aby to osiągnąć?Zadania w tle niezwiązane z żadnym klientem w Meteorzie

+0

Należy pamiętać, że nie ma czegoś takiego jak „klient” w wątku Meteor, w przeciwieństwie do bardziej tradycyjnych rozwiązań. Żądania klientów są przetwarzane asynchronicznie, a nie wielowątkowe. –

+0

Masz rację. Są włóknami, kooperatywnymi wielozadaniowości. – Mitar

Odpowiedz

5

Aby to zrobić w sposób, który umożliwia dowolne procesy zewnętrzne aktualizować klientów Meteor, użyj protokołu DDP, który jest powiązany z Meteor. Twoje procesy serwera mogą zapisywać na kanale DDP, a gdy to zrobią, twoi klienci będą aktualizować. Rzucić okiem na to stanowisko dla przykładu i przypadków użycia, które mogą być podobne do Ciebie:

Using node ddp-client to insert into a meteor collection from Node

Protokół jest dość prosta, a post pokazuje przykład node.js piśmie procesowym do kolekcji Mongo, która aktualizuje klientów w czasie rzeczywistym.

+0

Ehm, wróciłeś do tego pytania? – Mitar

+0

Gah - przepraszam za to. Naprawione. – mcauth

+0

Interesujące podejście. – Mitar

6

Uruchom je po stronie serwera. Jeśli regularnie masz na myśli codzienne zadania lub coś takiego:

Możesz użyć zadania crona z pakietem crona Toma Colemana: https://github.com/tmeasday/meteor-cron.

Musisz zainstalować meteorite package manager first: npm install meteorite -g a następnie zainstalować pakiet crona w projekcie reż mrt add cron-tick

Server js

var MyCron = new Cron(); 

// this job will happen every day (60 seconds * 60 * 24) 
MyCron.addJob(60*60*24, function() { 
    //Scrape your stuff 

    //Update your collections 
}); 

Jak najszybciej uruchomić aktualizacji/insert/edycja zostaną przekazane do wszystkich klientów.

+0

Czy istnieje sposób na przekazanie czegoś do klientów, który nie jest oparty na kolekcji (więc nie jest oparty na czymś w bazie danych)? Jak po prostu informacja, że ​​coś zostało zrobione? Powiadomienie? – Mitar

+1

W jakim wątku jest uruchamiane to zadanie cron? – Mitar

+1

Jest to nieco bardziej skomplikowane, javascript w węźle będzie w jednym wątku, więc tutaj wkracza Fibers. Jeśli używasz Meteor.call w cronie do meteoru.metoda z twoim zadaniem zawierająca 'this.unblock' zawartość w metodzie z' this.unblock' będzie działała w nowym blistrze, aby nie blokować innych klientów. Jeśli chodzi o inne rzeczy, które może wysłać meteor, polecam liczniki według kolekcji pokoi: http://stackoverflow.com/questions/10565654/how-does-the-messages-count-example-in-meteor-docs-work dobre miejsce na rozpoczęcie, zależy od tego, co dokładnie chcesz wysłać. – Akshat

1

Możesz spróbować wywołać Meteor.setInterval na serwerze (być może w Meteor.startup). To powinno zadziałać, choć może nie być tak elastyczne jak rozwiązanie crona.

+1

Chodzi o to, że mogę mieć niezależne procesy, nawet podzielić je na wiele serwerów. Tak naprawdę, ciężkie podnoszenie na maszynach roboczych. – Mitar

0

idź do http://atmospherejs.com i szukać cron

Najlepszym jeden znalazłem jest percolate:synced-cron

Instalacja

meteor add percolate:synced-cron

Podstawy

SyncedCron.add({ 
    name: 'Crunch some important numbers for the marketing department', 
    schedule: function(parser) { 
    // parser is a later.parse object 
    return parser.text('every 2 hours'); 
    }, 
    job: function() { 
    var numbersCrunched = CrushSomeNumbers(); 
    return numbersCrunched; 
    } 
}); 

SyncedCron.start(); 

zaawansowane

See their documentation

Powiązane problemy