En el patrón pub/sub los componentes son pobremente acompladas, será de gran ayuda para escalar ya que no hay necesidad de preocuparse por los suscriptores. Sin embargo, este acoplamiento puede conducir a un comportamiento inesperado cuando no se entienden completamente.
El ejemplo que se va a desarrollar se basa en la publicación sobre la introducción de ZeroMQ de Nicholas Piël.
El servidor genera una serie de mensaje de países y de eventos por país, la idea es publicar de forma aleatoria un país y un evento. Se creará 2 clientes donde cada uno mostrará la información de 2 países, eso es gracias a PUB/SUB ya que el suscriptor sólo recibe la información que necesita.
A continuación se muestra el código del servidor:
A continuación el código de los 2 clientes(suscriptores):#!/usr/bin/env python #Se importa ZeroMQ import zmq #Se importa choice a partir de random from random import choice #Se crea la instancia del contexto context = zmq.Context() #Se crea el socket pasandole argumento de publicacion PUB socket = context.socket(zmq.PUB) #Se asocia la IP y el puerto que va a escuchar. socket.bind("tcp://127.0.0.1:5000") #Se importa sleep from time import sleep #Se crea una lista de paises y de eventos paises = ['holanda','brasil','alemania','portugal','argentina','italia','rusia','venezuela'] eventos = ['tarjeta amarilla','tarjeta roja','gol','corner','falta'] #Se crea un contador con valor inicial 1 c = 1 #Se crea un ciclo indefinido while True: #Se define un mensaje pasando de forma aleatoria un pais y un evento mensaje = choice( paises) + " " + choice(eventos) #Se muestra en pantalla el valor del contador y el mensaje. print "->",c , mensaje #Se envia el mensaje socket.send(mensaje) #Se genera un retardo de 1 seg sleep(1) #Se incrementa el contador c += 1 #Si se llega a 180 se termina el ciclo si no continua. if c == 180: break else: continue
Cliente1:
#!/usr/bin/env python #Se importa zeroMQ import zmq #Se importa sleep a partir de time from time import sleep #Se crea la instancia del contexto de zeroMQ context = zmq.Context() #Se crea el socket del suscriptor SUB socket = context.socket(zmq.SUB) #Se crea la conexion a la IP y puerto del servidor socket.connect("tcp://127.0.0.1:5000") #Se define una opcion del socket del suscriptor con argentina y venezuela socket.setsockopt(zmq.SUBSCRIBE, "argentina") socket.setsockopt(zmq.SUBSCRIBE, "venezuela") #Se define el valor inicial de un contador c = 1 #Se crea un ciclo indefinido while True: #Se muestra en pantalla el valor del contador y el mensaje recibido print c, "->",socket.recv() #Se genera un retardo de 1 seg en cada ciclo sleep(1) #Se incrementa el contador en 1 c += 1 #Si el contador llega a 90 se termina el ciclo, si no continua if c == 90: break else: continueCliente 2:
#!/usr/bin/env python #Se importa zeroMQ import zmq #Se importa sleep a partir de time from time import sleep #Se crea la instancia del contexto de zeroMQ context = zmq.Context() #Se crea el socket del suscriptor SUB socket = context.socket(zmq.SUB) #Se crea la conexion a la IP y puerto del servidor socket.connect("tcp://127.0.0.1:5000") #Se define una opcion del socket del suscriptor con brasil y alemania socket.setsockopt(zmq.SUBSCRIBE, "brasil") socket.setsockopt(zmq.SUBSCRIBE, "alemania") #Se define el valor inicial de un contador c = 1 #Se crea un ciclo indefinido while True: #Se muestra en pantalla el valor del contador y el mensaje recibido print c, "->",socket.recv() #Se genera un retardo de 1 seg en cada ciclo sleep(1) #Se incrementa el contador en 1 c += 1 #Si el contador llega a 90 se termina el ciclo, si no continua if c == 90: break else: continue
Es como si el servidor estuviera narrando varios juegos de futbol y los clientes sólo muestran la información del partido de futbol que les interesa.
La siguiente figura muestra el resultado del servidor:
A continuación se muestra las 2 fíguras de los clientes:
Cliente 1 (Venezuela, Argentina):
Cliente 2(Brasil,Alemania):
Ya se va mostrando cosas más complicadas que se pueden hacer con ZeroMQ, y todavía faltan...
No hay comentarios:
Publicar un comentario