2009-10-23 13 views
13

suggeriresti l'utilizzo di beanstalkd [http://kr.github.com/beanstalkd/] perElaborazione asincrona PHP con beanstalkd. Lo raccomando?

elaborazione asincrona in PHP?

Ho bisogno di feedback/commenti pro-contro, da parte di chiunque abbia utilizzato questa libreria.

Grazie,

+0

Sarei anche interessato a leggere i commenti sulla stabilità a lungo termine di beanstalkd da parte di qualcuno che l'ha utilizzato in un ambiente di produzione –

+0

sono molto interessato anch'io. – inakiabt

+1

Hai provato Gearman? Credo che la community di Gearman-PHP sia più attiva. – mixdev

risposta

15

che ho usato Beanstalk nella produzione, e anche durante il test ha gettato milioni di messaggi semplici attraverso di essa - in genere en-massa, ma il sistema di produzione ha avuto più di un 100.000 compiti messo attraverso di essa fino a quando ho lasciato l'azienda. Potrebbe essere ancora in esecuzione, nel qual caso sarebbero ora decine di milioni - o più, se ne avessero esteso il suo uso ulteriore, come avevo programmato.

Lo consiglierei, dato che ha un numero di punti eccellenti.

  • named tubes possono essere utilizzati per limitare i lavori in fase di consegna. Guardo un tube basato sul nome host della macchina, che limita il punto in cui un lavoratore sarebbe in esecuzione, utile per i file caricati che sono memorizzati solo su un server particolare).
  • I ritardi possono essere utilizzati per impostare eventi futuri
  • Le ultime versioni del server supportano anche il bin-logging, fornendo persistenza, anche se non è mai andato in crash su di me.

Il mio primo compito ho messo attraverso di essa era l'elaborazione delle immagini - e di fare quel lavoro al di fuori di un processo/mod_php Apache mi ha permesso di ridimensionare le immagini più grandi senza compromettere il server (che spegne il Webserver). Con una coda leggermente caricata, aveva creato le miniature prima che la pagina si aggiornasse dopo il caricamento.

Esistono molte altre attività potenziali che potrebbero essere elaborate in modo asincrono.

Gli unici problemi che ho avuto è stato quello di assicurarsi che gli operai siano stati completati senza incidenti - o che siano stati rilevati errori in modo che il lavoro potesse essere "interrato", assicurando così che il lavoro non fosse reinserito in coda per essere eseguito di nuovo (e fare in modo che il lavoratore si blocchi nuovamente).

Avere riavviato anche i lavoratori per cancellare la memoria può essere utile in quanto il PHP è meno adatto ai processi di lunga durata.

+0

Cosa è stato utilizzato per estrarre i lavori dalla coda ed eseguirli? Questo è stato fatto anche in PHP? Se è così, i lavoratori sono stati eseguiti usando qualcosa come System_Daemon o c'era un cron job che veniva eseguito una volta ogni tanto? Altri approcci? –

+1

Avvio uno script di shell con Supervisord, e si mantiene in esecuzione, in attesa di un nuovo elemento, quindi di andare di nuovo. C'è un post con qualche dettaglio in più sul mio blog - http://www.phpscaling.com/2009/06/23/doing-the-work-elsewhere-sidebar-running-the-worker/ –

Problemi correlati