2011-10-11 34 views
12

Recentemente ho svolto ricerche sull'uso di Beanstalkd con PHP. Ho imparato un bel po ', ma hanno alcune domande circa l'installazione su un server, eccCome configurare Beanstalkd con PHP

Ecco come la vedo io a lavorare:

  1. installo Beanstalkd e le eventuali dipendenze (come libevent) sul mio server Ubuntu. Quindi avvio il demone Beanstalkd (che dovrebbe funzionare fondamentalmente sempre).
  2. Da qualche parte nel mio sito Web (ad esempio quando un utente esegue alcune azioni, ecc.) Le attività vengono aggiunte a varie provette all'interno della coda Beanstalkd.
  3. Ho uno script di bash (come il seguente) che viene eseguito come un deamon che esegue fondamentalmente uno script PHP.

    #!/bin/sh 
    php worker.php 
    

4) Lo script lavoratore avrebbe avuto qualcosa di simile per eseguire i compiti in coda:

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); 
} 

Ora qui sono le mie domande in base alla configurazione di cui sopra (che mi corregga se ho torto):

  1. Dire che ho il compito di importare un feed RSS in un database o qualcosa del genere. Se 10 utenti lo fanno in una volta, saranno tutti in coda nella "prova" del tubo. Tuttavia, sarebbero stati eseguiti solo uno alla volta. Sarebbe meglio avere 10 valvole diverse tutte in esecuzione contemporaneamente?

  2. Se ho bisogno di più tubi, vuol dire anche che avrei bisogno di 10 script di lavoro? Uno per ogni tubo tutti in esecuzione contemporaneamente con lo stesso codice, ad eccezione della stringa letterale nella funzione watch().

  3. Se eseguo quello script come demone, come funziona? Eseguirà costantemente lo script worker.php? Quel copione continua fino a quando la coda è vuota teoricamente, quindi non dovrebbe essere avviata solo una volta? Come decide il daemon con quale frequenza eseguire worker.php? È solo un'impostazione?

Grazie!

risposta

5
  1. Se il lavoratore non impiega troppo tempo a recuperare il feed, andrà bene. È possibile eseguire più lavoratori se necessario per elaborarne più di uno alla volta. Ho un sistema (che attualmente usa Amazon SQS, ma ho già fatto simili con BeanstalkD), con un massimo di 200 (o più) lavoratori che escono dalla coda.
  2. Un singolo script di lavoro (lo stesso script che viene eseguito più volte) dovrebbe andare bene: lo script può guardare più valvole contemporaneamente e il primo disponibile sarà riservato. Puoi anche usare il comando job-stat per vedere da dove proviene un determinato lavoro $ (che tube), o inserire alcune meta-informazioni nel messaggio se hai bisogno di distinguere ogni tipo da un altro.
  3. Un buon esempio di gestione di un worker è described here. Ho anche aggiunto supervisord (anche, un useful post per iniziare) per avviare e mantenere facilmente un numero di worker per macchina (eseguo script di shell, come nel first link).Limiterò il numero di volte che si ripete e inserirò un numero nello reserve() per attendere qualche secondo, o più, affinché il lavoro successivo diventi disponibile senza ruotare senza controllo in un circuito chiuso che non si ferma a tutti - anche se non c'era niente da fare.

Addendum:

  1. Lo script di shell potrebbe essere eseguito tutte le volte che è necessario. (il collegamento mostra come eseguirlo nuovamente come richiesto con exec [email protected]). Ogni volta che lo script php viene chiuso, esegue nuovamente PHP.
  2. Apparentemente c'è un'app Djanjo per mostrare alcune statistiche, ma è abbastanza banale per connettersi al daemon, ottenere un elenco di valvole e quindi ottenere le statistiche per ogni tubo - o semplicemente contare.
+0

Grazie per i collegamenti! Ne esaminerò sicuramente quelli. Una domanda su # 2: Quante volte dovrebbe essere eseguito quel copione? È interamente basato sulla frequenza con cui il mio demone esegue il mio script bash? – joshholat

+0

Inoltre, c'è un modo conveniente (tramite un frammento di codice o un tipo di "dashboard") per vedere cosa sta eseguendo tutto, ecc con beanstalk? – joshholat

+1

la maggior parte/tutta la libreria dovrebbe fornire una chiamata ai comandi stats, list-tubes e stat-tubes. Ce ne sono anche altri. Non ho visto https://github.com/andreisavu/django-jack in esecuzione, ma questo può fare anche alcune cose. –

Problemi correlati