SlideShare una empresa de Scribd logo
The redis queue for Symfony2
by @mmoreram
RSQueue
• 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
• 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.
• 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.
¡Flipencio somos
todos!
Como hacienda!
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?
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?
• 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.
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.
• Hay algunos sistemas de colas bastante elaborados.
• Beanstalkd.
• Kafka.
• Gearman.
• RabbitMQ.
• JMS.
• OpenMQ.
• ZeroMQ.
• ActiveMQ.
Y si trabajo con
symfony2?
• ¡Pues molas!
• Aparte de molar, también tienes opciones
para trabajar con colas.
• RabbitMQBundle for Symfony2.
• GearmanBundle for Symfony2.
• 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.
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%.
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.
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%!
RSQueue in action!
• 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!
• 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.
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!
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?
• 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.
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.
• ¿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!
• 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.
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.
Rsqueue bundle 06.2013
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.
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.
¡Muchas gracias!
¿Preguntas?

Más contenido relacionado

PDF
Gearman bundle, Warszawa 2013 edition
PDF
Dependency injection
PDF
El Efecto "Este código es una basura"
PDF
RabbitMQ y Symfony
PDF
Eventos, mensajería y otras fábulas - PulpoCon 2019
PDF
Introducción a Celery y las colas de tareas asíncronas
PDF
Escalabilidad y alto rendimiento con Symfony2
PPTX
SOA multiplataforma con rabbitmq y websockets
Gearman bundle, Warszawa 2013 edition
Dependency injection
El Efecto "Este código es una basura"
RabbitMQ y Symfony
Eventos, mensajería y otras fábulas - PulpoCon 2019
Introducción a Celery y las colas de tareas asíncronas
Escalabilidad y alto rendimiento con Symfony2
SOA multiplataforma con rabbitmq y websockets

Similar a Rsqueue bundle 06.2013 (20)

PDF
PDF
Mis primeros pasos con Symfony 2
PPSX
Introducción a symfony
PDF
Elementos sobre Symfony 2.1
PDF
Clase 2 conceptos fundamentales
PDF
Desymfony - Servicios
PDF
Symfony 1 y 2
PDF
Symfony en Drupal 8 - DrupalCamp Spain
PDF
Symfony2: Framework para PHP5
PDF
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
ODP
Sistema de Mensajeria de Colas con ZeroMQ y Python
PDF
Drupal8 & Symfony2
PDF
Clase 3 instalación y primeros pasos
PDF
Mq conceptos y programacion as400
PDF
Computacion distribuida usando Celery para Python
KEY
SpringIO 2012 Madrid-Escalabilidad con Grails
PDF
Symfony2 Formacion y primeros pasos
PDF
Clase 1 introducción a symfony 2
PPTX
Aprende a crear y desplegar una aplicación de python que use APIs de BlueVia
PPT
Symfony2 un framework para maximizar tu productividad en desarrollo web
Mis primeros pasos con Symfony 2
Introducción a symfony
Elementos sobre Symfony 2.1
Clase 2 conceptos fundamentales
Desymfony - Servicios
Symfony 1 y 2
Symfony en Drupal 8 - DrupalCamp Spain
Symfony2: Framework para PHP5
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Sistema de Mensajeria de Colas con ZeroMQ y Python
Drupal8 & Symfony2
Clase 3 instalación y primeros pasos
Mq conceptos y programacion as400
Computacion distribuida usando Celery para Python
SpringIO 2012 Madrid-Escalabilidad con Grails
Symfony2 Formacion y primeros pasos
Clase 1 introducción a symfony 2
Aprende a crear y desplegar una aplicación de python que use APIs de BlueVia
Symfony2 un framework para maximizar tu productividad en desarrollo web
Publicidad

Rsqueue bundle 06.2013

  • 1. The redis queue for Symfony2 by @mmoreram RSQueue
  • 2. • 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
  • 3. • 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.
  • 4. • 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.
  • 6. 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?
  • 7. 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?
  • 8. • 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.
  • 9. 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.
  • 10. • Hay algunos sistemas de colas bastante elaborados. • Beanstalkd. • Kafka. • Gearman. • RabbitMQ. • JMS. • OpenMQ. • ZeroMQ. • ActiveMQ.
  • 11. Y si trabajo con symfony2? • ¡Pues molas! • Aparte de molar, también tienes opciones para trabajar con colas. • RabbitMQBundle for Symfony2. • GearmanBundle for Symfony2.
  • 12. • 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.
  • 13. 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%.
  • 14. 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.
  • 15. 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%!
  • 17. • 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!
  • 18. • 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.
  • 20. • 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!
  • 22. • 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?
  • 23. • 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.
  • 25. 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.
  • 26. • ¿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!
  • 27. • 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.
  • 29. 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.
  • 32. 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.
  • 33. 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.