rsqueue bundle 06.2013

34
The redis queue for Symfony2 by @mmoreram RSQueue

Upload: marc-morera

Post on 08-Jul-2015

266 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Rsqueue bundle 06.2013

The redis queue for Symfony2 by @mmoreram

RSQueue

Page 2: Rsqueue bundle 06.2013

• Flipencio necesita mandar, urgentemente, una carta a su querida prima Primencia, en Albacete

• Flipencio es de Barcelona, así que como siempre, se sube a su burro Burr'oh y tras 30 dias de viaje entre praderas y bosques, llega a su destino.

• 60 dias mas tarde, su mujer sentada en la cocina, esperando, enfadada. ¿Porque has tardado tanto? Le pregunta...

• Hoy duermo en el sofá... #fail

Page 3: Rsqueue bundle 06.2013

• El camino es largo, piensa él. Tiene que alimentar un burro solo para mandar cartas y su mujer está siempre enfadada con él porque pasa poco tiempo con ella.

• ¡Ideaca!

• Monto una empresa de burros que solo mande correos, los alimente con el mejor manjar y me permita estar con mi querida mujer.

Page 4: Rsqueue bundle 06.2013

• La empresa Burreos S.L. se funda y actualmente tiene una flota nacional de 200 burros de la mejor raza, grandes, resistentes y fuertes, operando en todos los pueblos nacionales. ¡Tiene 30000 usuarios!

• Permite a nuestro entrañable personaje estar en casa mucho mas tiempo leyendo "50 sombras de grey", y sus cartas llegan de todas formas.

• Permite a Burreos autogestionarse y desarrollarse de forma independiente.

Page 5: Rsqueue bundle 06.2013

¡Flipencio somos todos!Como hacienda!

Page 6: Rsqueue bundle 06.2013

Cuantos de nuestros proyectos...

• ¿Manda correos a usuarios?

• ¿Hace logs en producción? No deberían ser muchos logs...

• ¿Escribe estadísticas para estrategias de negocio?

• ¿Actualiza un índice como ElasticS o SolR?

Page 7: Rsqueue bundle 06.2013

Cuantos de nuestros proyectos...

• ¿Hacemos esperar a nuestros usuarios para tales tareas? P.e. Un mail de confirmación.

• Tengamos en cuenta que existe una relación directa entre tiempo de carga de página y porcentaje de rebote de usuarios.

• ¿Que hacemos al respecto?

Page 8: Rsqueue bundle 06.2013

• Montemos una empresa que mande mails, una que escriba estadísticas y una que nos escriba en logs de forma asíncrona.

• Desde nuestros proyectos solo informamos qué queremos hacer, y que estas empresas se encarguen de ello.

• Nosotros nos encargamos de lo que realmente nos tenemos que encargar, de lo que al usuario le interesa.

Page 9: Rsqueue bundle 06.2013

Bienvenidas seáis, colas.

• Comunicación entre sistemas de forma asíncrona.

• A comunica a B que tiene que hacer un trabajo, y sigue con su ejecución aunque B no esté levantado. Lo añade a una lista de TODOs.

• B recoge los elementos de la lista cuando puede y ordenadamente, ejecuta los trabajos.

• Solo hay una condición. A y B deben entender ambos un sistema de escritura. Por ejemplo, JSON.

Page 10: Rsqueue bundle 06.2013

• Hay algunos sistemas de colas bastante elaborados.

• Beanstalkd.

• Kafka.

• Gearman.

• RabbitMQ.

• JMS.

• OpenMQ.

• ZeroMQ.

• ActiveMQ.

Page 11: Rsqueue bundle 06.2013

Y si trabajo con symfony2?

• ¡Pues molas!

• Aparte de molar, también tienes opciones para trabajar con colas.

• RabbitMQBundle for Symfony2.

• GearmanBundle for Symfony2.

Page 12: Rsqueue bundle 06.2013

• Pero... ¿Y hay algo que trabaje sobre Redis?

• Redis está concebido, en parte, como un sistema de colas. No hay ninguna implementación ( decente ) para symfony2 que resuelva esta carencia.

• ¡Rsqueue lo hace! O almenos pretende hacerlo.

Page 13: Rsqueue bundle 06.2013

RSQueueBundle• Redis Simple Queue bundle for Symfony2.

• Proporciona implementación de modelo Producer/Consumer y Publisher/Subscriber sobre sistema Redis.

• Trabaja con eventos propios y serializadores propios ( permite nuevos desarrollos ).

• Open source 110%.

Page 14: Rsqueue bundle 06.2013

Producer/Consumer• Muy simple. Producers escriben, consumers

leen.

• Los consumers, recogen el primer job de la cola y lo procesan. Capacidad para encolar de nuevo en caso de error de proceso.

• Un elemento solo es procesado por una cola, por ejemplo, un mail lo manda solo un consumidor.

Page 15: Rsqueue bundle 06.2013

Publisher/Subscriber• El concepto es practicamente igual, con la única

diferencia que un item es procesado por todos los subscribers de la cola a la cual pertenece.

• Por ejemplo, por cada visita añadimos un job en la cola A.

• Hay 5 procesos distintos que, con estos elementos, crean estadísticas.

• ¡Procesos desacoplados al 100%!

Page 16: Rsqueue bundle 06.2013

RSQueue in action!

Page 17: Rsqueue bundle 06.2013

• Toda la interacción con el sistema de colas funciona sobre la capa de servicio.

• Para los consumers y los subscribers, hay una forma muy sencilla de trabajar con commands de Symfony2.

• ¡Custom events para todos!

Page 18: Rsqueue bundle 06.2013

• Para empezar, debemos elegir que tipo de serialización queremos utilizar, por defecto json.

• Tenemos json, php y la posibilidad de implementar nuestro serializador propio.

• También tenemos que definir el conjunto de colas con los que vamos a trabajar. Una vez definidas, en nuestros proyecto trataremos solo con sus alias.

Page 19: Rsqueue bundle 06.2013
Page 20: Rsqueue bundle 06.2013

• Siguiendo el desarrollo del proyecto, se podrá configurar también distintas conexiones.

• Por el momento, solo localhost:6379

• ¡Seguimos! Una vez configurado, vamos a insertar un elemento en nuestra cola de nuevos usuarios.

• ¡Recordemos, debemos trabajar siempre con los alias de las colas!

Page 21: Rsqueue bundle 06.2013
Page 22: Rsqueue bundle 06.2013

• Una vez encolado nuestro mail, nos desentendemos completamente del resultado del envío ( el consumer deberá tratar los errores ).

• Nos ahorramos instalar sistemas de mailing como swiftmailer en nuestro proceso y también el tiempo que conlleva mandar un mail.

• ¡Vale! ¡Encolado! ¿Pero ahora que?

Page 23: Rsqueue bundle 06.2013

• RSQueue nos permite crear fácilmente comandos que se comporten como consumers.

• Simplemente tenemos que definir que colas queremos consumir, y como tratar los datos recibidos en función de la cola, especificando que método queremos ejecutar en cada caso.

Page 24: Rsqueue bundle 06.2013
Page 25: Rsqueue bundle 06.2013

php app/console test:consumer --timeout 5 --iterations 10 --sleep 1

• Timeout: cuando un proceso consume una cola, se puede especificar el número de segundos antes de morir si no hay elementos. 0, nunca muere, paciencia infinita, por defecto.

• Iterations: cuantos elementos debe consumir antes de morir. 0, infinitos, por defecto.

• Sleep: cuanto debe esperar entre elemento y elemento. Muy útil para parsing. 0, sin sleep, por defecto.

Page 26: Rsqueue bundle 06.2013

• ¿Has dicho morir?

• Si. Un proceso debería morir cada cierto número de iteraciones por cuestiones de memoria.

• Deberíamos tener instalado ( si o si ) un supervisord, que se encarga de levantar x instancias de un proceso, manteniendo siempre el número de instancias vivas. ¡Función alive ON!

Page 27: Rsqueue bundle 06.2013

• Igual funciona un comando del estilo subscriber o psubscriber ( la segunda defines las colas a las que suscribirse por expresión regular ).

• Por otro lado, el producer y el publisher funcionan de la misma forma de cara el usuario.

Page 28: Rsqueue bundle 06.2013
Page 29: Rsqueue bundle 06.2013

Rizando el rizo...

• Queremos añadir en la cola de eventos un objeto DateTime cada vez que un subscriber o un consumer recoge un dato de una cola.

• Creamos un servicio con dos métodos, y subscribimos los métodos a dos de los eventos propios de RSQueue.

Page 30: Rsqueue bundle 06.2013
Page 31: Rsqueue bundle 06.2013
Page 32: Rsqueue bundle 06.2013

Symfony2 profiler• Se añade en la toolbar del profiler una nueva

sección, donde te informa en cada ejecución todas las interacciones con los servicios ( producers y publishers ).

• También proporciona información sobre las colas afectadas y los payloads con los que se han tratado.

• Asi podemos saber si hemos mandado el mail.

Page 33: Rsqueue bundle 06.2013

Conclusión• Trabaja con colas... ¡Sin miedo!

• Si trabajas en symfony2, ya no tienes escusa.

• El proyecto irá creciendo, con nuevas funcionalidades, sobretodo de análisis y monitorización.

• Cualquier ayuda será agradecida.

Page 34: Rsqueue bundle 06.2013

¡Muchas gracias! ¿Preguntas?