2010
07.13

Beanstalk es un software que permite poner tareas en cola, esto puede ser muy útil a la hora de realizar procesos que requieren mucho tiempo de ejecución y que pueden deteriorar la experiencia del usuario.

Al poner los procesos en cola, nuestra aplicación puede seguir su curso normal mientras se ejecutan las tareas encoladas en segundo plano, sin que el usuario lo note.

Para poder instalarlo en Debian o Ubuntu, debemos descargar la fuente y descomprimirla:

apt-get install libevent-1.4-2 libevent-dev
wget http://xph.us/dist/beanstalkd/beanstalkd-1.4.6.tar.gz
tar xzfv beanstalkd-1.4.6.tar.gz

Y se ejecuta:

beanstalkd -d -l 0.0.0.0 -p 11300

Esto causa que beanstalkd inicie en modo demonio, escuchando todas las direcciones en el puerto 11300.

La utilización de esta herramienta con CakePHP está muy bien explicada .

Con mi propia experiencia puedo aportar algunas cosas:
Enterrar procesos fallidos:

Cuando encolamos un proceso y este falla, podemos eliminarlo definitivamente o enterrarlo, para que luego pueda volver a ser ejecutado por beanstalk. Este método se llama “buri” y se usa más o menos asi:

En un shell de CakePHP (1.3):

 PHP |  copy code |? 
01
02
<?php
03
class EnviarMailShell extends Shell
04
{
05
	var $uses = array('Queue.Job');
06
	var $tubes = array('enviar_mail');
07
 
08
	function main()
09
	{
10
		App::import('Correo');
11
		while (true) {
12
			$job = $this->Job->reserve(array('tube' => $this->tubes));
13
			$correo = new Correo();
14
			if ($correo->EnviarCorreo($job['Job']['id_usuario'])) {
15
				$this->Job->delete();
16
				$this->out('Se ha enviado el correo exitosamente');
17
			} else {
18
				$this->Job->bury(); //En caso de falla, lo enterramos!
19
			}
20
		}
21
	}
22
}
23
?>
24

Volvemos a encolarlo con Kick:

 PHP |  copy code |? 
1
2
ClassRegistry::init('Queue.Job')->kick(array('tube' => 'enviar_mail'));
3

Espero que les sirva.

  • Digg
  • Facebook
  • Delicious
  • Twitter
  • Share/Bookmark
VN:F [1.9.3_1094]
Rating: 10.0/10 (2 votes cast)
Beanstalk con CakePHP sobre Debian, 10.0 out of 10 based on 2 ratings

4 comentarios

Agregue su comantario
  1. [...] This post was mentioned on Twitter by vladzur, vladzur. vladzur said: Beanstalk en Ubuntu (Debian) http://is.gd/dqIUF [...]

  2. VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)

    Muchas gracias por el codigo ;)

    Te hago una pregunta, veo que tu shell task se ejecuta infinitamente (por el while true). ¿No tenés problemas con el tiempo maximo de ejecucion de un script php que esta configurado en el server?
    ¿Para que usas el kick?

    Gracias de antemano por la ayuda!

  3. VN:F [1.9.3_1094]
    Rating: 0 (from 0 votes)

    Hola, gracias por tu comentario. No hay problema con el tiempo máximo de ejecución, porque el script se ejecuta en el servidor no desde apache, sino como cualquier shell y esto se hace justamente para que quede a la espera de recibir una tarea proveniente de beanstalkd. El Kick se usa para volver a dejar en la cola aquellas tareas que quedaron pendientes y fueron enterradas (bury), esto es para no entorpecer el resto de las tareas que llegan a la cola.
    La decisión de enterrar una tarea que falla depende de qué tipo de falla se pueda presentar, si tenemos una tarea que puede fallar por que tiene que esperar a otra, podemos enterrarla hasta ejecutar la otra tarea y una vez completados los procesos de que esta depende, ponemos los procesos enterrados nuevamente en la cola con kick, no sé si me explico bien, pero quedo atento a las dudas.

  4. VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)

    Ok, Gracias ;) Si, se entendio perfecto

    Despues te cuento como me fue :)

    Saludos!