Documentos de Académico
Documentos de Profesional
Documentos de Cultura
7.1. Descripción
El Patrón Publica-Suscribe (Publish – Subscribe Pattern, como se le conoce en el idioma
inglés) es un patrón arquitectónico, frecuentemente utilizado en el desarrollo de muchos
sistemas actualmente. El patrón se basa en el envío asíncrono de mensajes, que representan
eventos, permitiendo que un conjunto de componentes publicadores envíen éstos a un
conjunto de componentes suscriptores. Un evento es un tipo especial de mensaje –que
emite un componente, para informar –a otros componentes iteresados, que algo sucedió en
el pasado.
Los publicadores no tienen conocimiento explícito de los suscriptores que existen. Igual-
mente, los suscriptores no tienen conocimiento explícito de los publicadores que existen.
Los eventos que se transmiten pueden clasificarse por tipos y de esta forma los suscriptores
pueden sucribirse para recibir los eventos de su interés.
Implementaciones básicas de este patrón incluyen uno o más componentes de tipo Pu-
blicador (Publisher, como se le conoce en el idioma inglés), dos o más componentes de
tipo Suscriptor (Subscriber, como se les conoce en el idioma inglés) y un conector llamado
Distribuidor de Mensajes (Broker, como se le conoce en el idioma inglés). La Tabla 7.2
describe con más detalle dichos elementos así como otros aspectos de interés sobre el Pa-
trón Publica-Suscribe.
25
26 7. PATRÓN PUBLICA-SUSCRIBE
Cuadro 7.1: Descripción de elementos y otros aspectos de interés del Patrón Publica-
Suscribe.
En la figura 8.1 se muestra una vista estática del patrón Publica - Subscribe, en términos
de la información descrita anteriormente. Por otro lado, en la figura 8.2 se muestra una
vista dinámica del patrón, en donde se puede observar cómo interactúan sus elementos.
7.1. DESCRIPCIÓN 27
- Como Asistente de Área necesito visualizar en mi monitor una alerta cuando un adul-
to mayor presente signos vitales anormales, de forma que pueda ayudar a asegurar
que se le brinde atención inmediata.
- Como Asistente de Área necesito consultar la infomación actual sobre los signos
vitales de un adulto mayor, de forma que pueda prevenir o dar seguimiento a una
incidencia de salud.
- Como Administrador/a necesito gestionar los usuarios del sistema, para mantener
un catálogo actualizado.
- Desempeño: cuando un adulto mayor presente un signo vital anormal, la alerta co-
rrespondiente debe llegar a los usuarios interesados en no más de 1.5 segundos.
- Confibialidad: el sistema deberá tener una precisión en las medidas de los signos
vitales de al menos 99.9 %.
- Se deberá utilizar Python como lenguaje de programación ya que este es el que mejor
conoce la comunidad Girls that Code in Python.
- Se deberá utilizar el API de Xiaomi My Band para la comunicación con los disposi-
tivos “wearables”.
Figura 7.3: Diagrama de contexto del Sistema de Monitoreo de Adultos Mayores (SMAM).
un publicador aunque en el SMAM real son varios. Después tenemos el conector que es-
tá representado por el distribuidor de mensajes. El sistema cuenta con tres suscriptores
en donde cada uno recibe los eventos de valores extremos de signos vitales para dar un
tratamiento específico considerando los requerimientos arquitecturales.
7.3.1. RabbitMQ
RabbitMQ es una tecnología de tipo “middleware” (como se le conoce en el idioma
inglés) que implementa un Distribuidor de Mensajes y que puede ser (re)utilizada para el
diseño e implementación de sistemas que usan la estrutura del Patrón Publica - Suscribe.
RabbitMQ es compatible con muchos sistemas operativos y lenguajes de programación.
Esta tecnología utiliza, entre otros, un Protocolo Avanzado de Encolamiento de Mensa-
jes (AMQP, por sus siglas en inglés), lo que permite un soporte más robusto durante el
intercambio de mensajes entre los Publicadores y Suscriptores. RabittMQ permite robus-
7.3. IMPLEMENTACIÓN CON RABBITMQ 31
Figura 7.4: Vista de módulos del Sistema de Monitoreo de Adultos Mayores (SMAM).
Figura 7.5: Vista dinámica del Sistema de Monitoreo de Adultos Mayores (SMAM).
7.3. IMPLEMENTACIÓN CON RABBITMQ 33
Para la implementación del SMAM estos elementos fueron utilizados como se muestra
en la figura 7.6. Como puede observarse se implementaron 3 colas que permiten establecer
conexión con los Suscriptores (ver Notificador de alertas de signos vitales, Log, Monitor).
El elemento Exchange se conecta con los “weareables” para recibir la información que
estos tienen sobre los signos vitales. El Exchange enruta los mensajes que contienen esta
información a la cola correspondiente, para su entrega a los Suscriptores.
Por otro lado, en la figura 7.7 es posible observar la vista dinámica presentada ante-
riormente pero ahora con los componentes que conforman al Distribuidor de Mensajes.
34 7. PATRÓN PUBLICA-SUSCRIBE
7.3.2. Implementación
El código del SMAM se puede descargar del siguiente repositorio, desde el directorio
correspondiente al capítulo 4:
https://gitlab.com/tareas-arquitectura-de-software-curso/publica-suscribe
En la figura 7.8 se muestra la estructura del directorio del capítulo 4. Se pueden obser-
var tres directorios: “docs”, ”publicadores” y “suscriptores”. El directorio “docs” contiene
documentos complementarios para el proyecto; El directorio “publicadores” contiene el
código fuente de los publicadores del sistema SMAM. Por otro lado, el directorio ”suscrip-
tores” contiene el código fuente de los suscriptores del sistema SMAM. La versión actual
del sistema fue realizada usando el lenguaje de programación Python en su versión 3.8
7.3. IMPLEMENTACIÓN CON RABBITMQ 35
Figura 7.7: Vista dinámica del Sistema de Monitoreo de Adultos Mayores (SMAM) con
los elementos de RabbitMQ.
Publicador
En el código 7.1 se muestra un extracto del código fuente de un “wereable”, que como
ya se explicó anteriormente, corresponde a un Publicador en el SMAM. Específicamente,
se muestra el código que corresponde a la simulación de la lectura de los signos vitales de
un adulto mayor.
Suscriptor
En el código 7.3 se muestra un extracto del código fuente del “monitor” del sistema,
que es el responsable de mostrar las alertas de los signos vitales anormales detectados entre
los adultos mayores. Este ”monitor” corresponde a un suscriptor que se comunica con el
Distribuidor de Mensajes para recibir los signos vitales.
12
13 def callback ( self , ch , method , properties , body ) :
14 data = json . loads ( body . decode ( " utf -8 " ) )
15 print ( " ADVERTENCIA !!! " )
16 print ( f " [{ data [ ’ wearable ’][ ’ date ’]}]: asistir al paciente { data [ ’
name ’]} { data [ ’ last_name ’]}... con wearable { data [ ’ wearable ’][ ’ id ’]} " )
17 print ( f " ssn : { data [ ’ ssn ’]} , edad : { data [ ’ age ’]} , temperatura : {
round ( data [ ’ wearable ’][ ’ temperature ’] , 1) } , ritmo cardiaco : { data [ ’
wearable ’][ ’ heart_rate ’]} , p r e s i n arterial : { data [ ’ wearable ’][ ’
blood_pressure ’]} , dispositivo : { data [ ’ wearable ’][ ’ id ’]} " )
18 print ()
19 time . sleep (1)
20 ch . basic_ack ( delivery_tag = method . delivery_tag )
Como se puede observar, en el código anterior se definen dos métodos, consume y callback
; el primero es el encargado de realizar la conexión hacia el Distribuidor de Mensajes;
mientras que el segundo es responsable de procesar los mensajes recibidos desde Distri-
buidor de Mensajes. A continuación se describirá con más detalle la implementación su
implementación.
La conexión entre el suscriptor y el Distribuidor de Mensajes se realiza con el código
7.4, mostrado a continuación.
4 print ( f " [{ data [ ’ wearable ’][ ’ date ’]}]: asistir al paciente { data [ ’
name ’]} { data [ ’ last_name ’]}... con wearable { data [ ’ wearable ’][ ’ id ’]} " )
5 print ( f " ssn : { data [ ’ ssn ’]} , edad : { data [ ’ age ’]} , temperatura : {
round ( data [ ’ wearable ’][ ’ temperature ’] , 1) } , ritmo cardiaco : { data [ ’
wearable ’][ ’ heart_rate ’]} , p r e s i n arterial : { data [ ’ wearable ’][ ’
blood_pressure ’]} , dispositivo : { data [ ’ wearable ’][ ’ id ’]} " )
6 print ()
7 time . sleep (1)
8 ch . basic_ack ( delivery_tag = method . delivery_tag )
7.3.4. Ejecución
Una vez descargado el sistema, Sigue los siguientes pasos para ejecutarlo.
Lo primero será instanciar el Distribuidor de mensajes RabbitMQ utilizando Docker.
Utiliza el siguiente comando para instanciar el Distribuidor de mensajes con Docker.
Por otro lado, en la figura 7.12 muestra la ejecución de un Suscriptor, que en éste caso
corresponde al procesador de temperatura. Este componente recibe los mensajes enviados
desde el Publicador a través del Distribuidor de mensajes y los procesa para detectar
valores superiores a los límites permitidos en los signos vitales de un adulto mayor.