2009-06-22 18 views
48

Najnowsza wersja Google App Engine obsługuje nowy Task Queue API w języku Python. Porównywałem możliwości tego interfejsu API z już istniejącym Cron service. W przypadku zadań działających w tle, które nie są inicjowane przez użytkownika, takich jak pobieranie kanału RSS i przetwarzanie go w odstępach dziennych. Czy i czy interfejs API kolejki zadań może być używany w przypadku takich żądań, które nie są inicjowane przez użytkownika?Google App Engine - kolejki zadań a zadania Cron

Odpowiedz

24

Powiedziałbym "coś w rodzaju". Należy pamiętać o kolejkach zadań:

1) limit operacji na minutę/godzinę/dzień to nie to samo, co powtarzanie w regularnych odstępach czasu. Nawet przy ustawieniu rozmiaru wiadra tokena na 1, nie sądzę, że masz gwarancję, że te powtórzenia będą równomiernie rozmieszczone. Zależy to od tego, jak poważne są, gdy mówią, że kolejka jest zaimplementowana jako wiadro tokena i czy ta instrukcja ma być gwarantowaną częścią interfejsu. To jest laboratorium, nic nie jest jeszcze zagwarantowane.

2) jeśli zadanie nie powiedzie się, jest ono ponownie zgłaszane. Jeśli zadanie cron nie powiedzie się, jest ono rejestrowane i nie jest ponawiane, dopóki nie zostanie ponownie wykonane. Tak więc zadanie cron nie zachowuje się w taki sam sposób, jak zadanie, które dodaje swoją kopię, a następnie odświeża Twój kanał lub jako zadanie, które odświeża Twój kanał, a następnie dodaje jego kopię.

Może okazać się, że możliwe będzie wyśmianie zadań crona przy użyciu zadań, ale wątpię, czy warto. Jeśli próbujesz obejść zadanie cron, które trwa dłużej niż 30 sekund, aby uruchomić (lub uderza w dowolny inny limit żądania), możesz podzielić pracę na części i mieć zadanie cron, które dodaje wszystkie elementy do kolejka zadań. Było kilka rozmów (na blogu GAE?) O asynchronicznym urlfetch, który może być najlepszym sposobem na aktualizację kanałów RSS.

+1

asynchroniczny UrlFetch istnieje do dzisiaj, zobaczyć http://code.google.com/appengine/docs/python/urlfetch/asynchronousrequests.html - ale nie jestem pewien, jak to byłby najlepszym sposobem aktualizacji kanałów RSS; może masz na myśli coś jeszcze? –

+1

Z jakiegoś powodu spodziewałem się czegoś, co oddzwoniłoby do adresu URL po otrzymaniu pobranych danych. Nie wiem, skąd wziąłem ten pomysł, ale może moja wyobraźnia. Jeśli jednak aktualizujesz wiele kanałów RSS, potrzebujesz, aby żądania HTTP były jakoś równoległe, a same koleje zadań zezwalają na tyle jednoczesnych instancji. Całkiem możliwe, że interfejs API, który wskażesz, już wykonuje zadanie. –

+4

Warto dodać, że można również użyć zadania cron do wypełnienia/zarządzania kolejką zadań, więc możesz mieć to w obie strony. –

5

Sposób, w jaki na to patrzę, polega na tym, że jeśli przetwarzam tylko jeden kanał RSS, zadanie Crona może być wystarczająco dobre. Jeśli muszę przeanalizować X liczbę kanałów RSS określonych w czasie wykonywania przez użytkownika lub dowolną inną zmienną systemową, wybrałbym za każdym razem zadania.

Mówię to tylko dlatego, że w przeszłości musiałem wyodrębniać wiele wyszukiwanych przez użytkownika wyszukiwań twitterów w regularnych odstępach czasu, a przy zadaniach Cron zakończyłem tworzenie bardzo złego systemu Queueing w celu wykonania żądań, które musiały zostać uruchomione - nie " Skala t nie pomogła, a najmniejsza przerwa w pracy crona to tylko 1 minuta (miałem więcej wyszukiwań niż minut w ciągu dnia).

Fajną rzeczą w zadaniach jest to, że możesz dać im ETA, więc możesz powiedzieć, że chciałbym, żeby to zostało wykonane 47 sekund w przyszłości, lub chciałbym, żeby to zostało wykonane o 12:30.