2011-10-11 16 views
12

Ostatnio badałem wykorzystanie Beanstalkd z PHP. Nauczyłem się sporo, ale mają kilka pytań dotyczących konfiguracji na serwerze itpJak skonfigurować Beanstalkd z PHP

Oto jak widzę to działa:

  1. zainstalować Beanstalkd oraz wszelkie zależności (takie jak libevent) na moim serwerze Ubuntu. Następnie uruchamiam demona Beanstalkd (który powinien zasadniczo działać przez cały czas).
  2. Gdzieś w mojej witrynie (np. Gdy użytkownik wykonuje pewne czynności itp.) Zadania są dodawane do różnych rur w kolejce Beanstalkd.
  3. Mam skrypt bash (taki jak następujący), który jest uruchamiany jako deamon, który zasadniczo wykonuje skrypt PHP.

    #!/bin/sh 
    php worker.php 
    

4) Skrypt pracownik miałby coś takiego wykonać w kolejce zadań:

while(1) { 
    $job = $this->pheanstalk->watch('test')->ignore('default')->reserve(); 
    $job_encoded = json_decode($job->getData(), false); 
    $done_jobs[] = $job_encoded; 
    $this->log('job:'.print_r($job_encoded, 1)); 
    $this->pheanstalk->delete($job); 
} 

Teraz tutaj są moje pytania oparte na powyższej konfiguracji (co mnie poprawić jeśli się "Myliłem się o to):

  1. Powiedzmy, że mam za zadanie zaimportować kanał RSS do bazy danych lub coś podobnego. Jeśli 10 użytkowników zrobi to za jednym razem, wszyscy zostaną umieszczeni w kolejce w probówce "testowej". Jednak byłyby one wykonywane tylko jeden po drugim. Czy byłoby lepiej mieć jednocześnie 10 różnych rurek?

  2. Jeśli potrzebuję więcej lamp, czy to oznacza, że ​​potrzebuję 10 skryptów roboczych? Jedna dla każdej tuby działa jednocześnie z zasadniczo tym samym kodem, z wyjątkiem literału ciągu znaków w funkcji watch().

  3. Jeśli uruchamiam ten skrypt jako demon, jak to działa? Czy będzie ciągle wykonywać skrypt worker.php? Ten skrypt zapętla się, dopóki kolejka nie będzie pusta teoretycznie, więc czy nie powinno się go uruchamiać tylko raz? W jaki sposób demon decyduje o tym, jak często uruchamiać plik worker.php? Czy to tylko ustawienie?

Dzięki!

Odpowiedz

5
  1. Jeśli pracownik nie będzie pobierał zbyt długo, będzie w porządku. W razie potrzeby można uruchomić wielu pracowników, aby przetwarzać więcej niż jeden naraz. Mam system (obecnie używający Amazon SQS, ale wcześniej zrobiłem to samo z BeanstalkD), z maksymalnie 200 (lub więcej) pracownikami wyciągającymi z kolejki.
  2. Pojedynczy skrypt roboczy (ten sam skrypt uruchomiony kilka razy) powinien być w porządku - skrypt może oglądać wiele lamp jednocześnie, a pierwszy dostępny będzie zarezerwowany. Możesz także użyć polecenia job-stat, aby sprawdzić, skąd pochodzi konkretne zlecenie $ (ta rura), lub umieścić w wiadomości jakieś meta-informacje, jeśli chcesz powiedzieć każdy typ z innego.
  3. Dobrym przykładem uruchomienia pracownika jest described here. Dodałem także supervisord (również, useful post, aby rozpocząć), aby łatwo uruchomić i utrzymać liczbę pracowników na maszynę (uruchamiam skrypty powłoki, jak w first link).Ograniczałbym liczbę pętli, a także wstawiałam numer do reserve(), aby poczekał kilka sekund lub więcej, aby następne zadanie stało się dostępne bez wymykania się spod kontroli w ciasnej pętli, która nie zatrzymuje się w ogóle - nawet jeśli nie było nic do zrobienia.

Uzupełnienie:

  1. Skrypt powłoki będzie działać tyle razy, ile trzeba. (link pokazuje, jak je ponownie uruchomić zgodnie z wymaganiami z exec [email protected]). Za każdym razem, gdy skrypt php wychodzi, ponownie uruchamia PHP.
  2. Wygląda na to, że istnieje aplikacja Djanjo do wyświetlania niektórych statystyk, ale dość banalnie, aby połączyć się z demonem, uzyskać listę lamp, a następnie uzyskać statystyki dla każdej tuby - lub po prostu liczy się.
+0

Dzięki za linki! Na pewno się tym zajrzę. Pytanie o nr 2: Jak często ten skrypt byłby wykonywany? Czy jest to całkowicie oparte na tym, jak często mój skrypt basha jest wykonywany przez demona? – joshholat

+0

Czy jest też jakaś wygodna metoda (za pomocą fragmentu kodu lub typu "deski rozdzielczej"), aby zobaczyć, co się dzieje, itp. Z paskiem fasoli? – joshholat

+1

większość/cała biblioteka powinna zapewniać wywołanie komend stats, list-tubes i stat-tubes. Są też inne. Nie widziałem jeszcze https://github.com/andreisavu/django-jack, ale to też może zrobić. –