Hola, quiero mejorar el sistema de colas de trabajo que ahora tengo.
Os cuento un poco como está la cosa: utilizamos Amazon SQS con una cola de mensajes para cada servidor, y un worker (daemon con PHP) en cada server que va descargando la cola y realizando los trabajos que correspondan.
Esto nos está funcionando bien, solo que has de saber a qué server has de enviar el mensaje, y es algo que no me gusta, ese acoplamiento tan "hard" hace que según vamos creciendo de servidores la cosa vaya complicándose. Queremos dar un paso más hacia microservicios, de forma que un proceso (una web, otro microservicio, app, etc.) lance un mensaje a un bus general y los diferentes microservicios vayan leyendo de de dicho bus los mensajes. Si es un mensaje con el que ha de hacer algo, lo hace, si no pasa al siguiente mensaje.
Es decir, un mensaje debe llegar a N microservicios y cada uno ya lo procesará o no, y hará lo que tenga que hacer. Por ejemplo, se puede lanzar el mensaje "cancelAccount" y un microservicio cancela la parte de la suscripción de PayPal, otro se encarga de eliminar los contenidos, otro de cancelar la suscripción el mail marketing, etc. También habrá un microservicio de logging, para registrar todos los mensajes, y otro de benchmarking que nos alerte cuando un mensaje se queda demasiado tiempo sin respuesta.
He estado leyendo sobre pub/sub y sobre cómo implementar con Amazon SNS y Amazon SQS. También estuve mirando ZeroMQ, que creo que es lo más parecido a lo que necesitamos. Pero no termino de ver claro cual es la mejor opción para implementar lo descrito. Si necesitamos un broker, un proxy, etc.
¿Alguien con experiencia en implementar un Message Bus general a todo el sistema nos podría orientar? Gracias.
Pues te comento mi experiencia. Yo trabajo con Azure service bus y con rabbit mq. Estos dos servicios de colas tienen una funcionalidad que se llama routing, creo que seria perfecta para lo que tu necesitas. Aqui te dejo el link a la documentacion de rabbit mq con topics y routing https://www.rabbitmq.com/tutorials/tutorial-five-php.html. Un topic mandara el mensaje, dependiendo del routing, a las subscripciones, y vosotros tendriais los microservicios consumiendo de las subscripciones que sean las correctas para esos microservicios.
Por lo que he visto (no tengo experiencia en AWS ni con sus colas) no es posible hacer routing con Amazon SNS y Amazon SQS, asi que mi recomendacion seria que os montaseis vuestro propio cluster de rabbit mq.
Preguntaba precisamente porque no veo claro cómo hacerlo con Amazon, pero por otra parte no me termina de gustar el montar un sistema propio, aunque veo que al final lo tendremos que hacer.
Por lo que veo RabbitMQ es un sistema bastante utilizado. ZeroMQ permite hacer básicamente lo mismo: http://zguide.zeromq.org/php:chapter5
Gracias Javi por responder y compartir tu experiencia.
Os cuento un poco como está la cosa: utilizamos Amazon SQS con una cola de mensajes para cada servidor, y un worker (daemon con PHP) en cada server que va descargando la cola y realizando los trabajos que correspondan.
Esto nos está funcionando bien, solo que has de saber a qué server has de enviar el mensaje, y es algo que no me gusta, ese acoplamiento tan "hard" hace que según vamos creciendo de servidores la cosa vaya complicándose. Queremos dar un paso más hacia microservicios, de forma que un proceso (una web, otro microservicio, app, etc.) lance un mensaje a un bus general y los diferentes microservicios vayan leyendo de de dicho bus los mensajes. Si es un mensaje con el que ha de hacer algo, lo hace, si no pasa al siguiente mensaje.
Es decir, un mensaje debe llegar a N microservicios y cada uno ya lo procesará o no, y hará lo que tenga que hacer. Por ejemplo, se puede lanzar el mensaje "cancelAccount" y un microservicio cancela la parte de la suscripción de PayPal, otro se encarga de eliminar los contenidos, otro de cancelar la suscripción el mail marketing, etc. También habrá un microservicio de logging, para registrar todos los mensajes, y otro de benchmarking que nos alerte cuando un mensaje se queda demasiado tiempo sin respuesta.
He estado leyendo sobre pub/sub y sobre cómo implementar con Amazon SNS y Amazon SQS. También estuve mirando ZeroMQ, que creo que es lo más parecido a lo que necesitamos. Pero no termino de ver claro cual es la mejor opción para implementar lo descrito. Si necesitamos un broker, un proxy, etc.
¿Alguien con experiencia en implementar un Message Bus general a todo el sistema nos podría orientar? Gracias.
21/03/2017 00:26
Pues te comento mi experiencia. Yo trabajo con Azure service bus y con rabbit mq. Estos dos servicios de colas tienen una funcionalidad que se llama routing, creo que seria perfecta para lo que tu necesitas. Aqui te dejo el link a la documentacion de rabbit mq con topics y routing https://www.rabbitmq.com/tutorials/tutorial-five-php.html. Un topic mandara el mensaje, dependiendo del routing, a las subscripciones, y vosotros tendriais los microservicios consumiendo de las subscripciones que sean las correctas para esos microservicios.
Por lo que he visto (no tengo experiencia en AWS ni con sus colas) no es posible hacer routing con Amazon SNS y Amazon SQS, asi que mi recomendacion seria que os montaseis vuestro propio cluster de rabbit mq.
Saludos.
Javi
21/03/2017 11:54
Por lo que veo RabbitMQ es un sistema bastante utilizado. ZeroMQ permite hacer básicamente lo mismo: http://zguide.zeromq.org/php:chapter5
Gracias Javi por responder y compartir tu experiencia.