Você está na página 1de 6

CM-14

PON 52

Implementación de los Requerimientos de Comunicación para un Sistema


de Seguridad con el Patrón de Mensajería Recipient List y RabbitMQ

Ing. Oscar Beltrán Gómez, M.I. Arión Juárez Menchaca, M.I. José Alberto Domínguez Terrazas
Universidad Autónoma de Chihuahua, Facultad de Ingeniería
Circuito Universitario Campus II
Tels. (614) 442-9500
Chihuahua, Chih., México
obeltran@uach.mx, ajuarez@uach.mx, jdomingue@uach.mx

Resumen La integración de aplicaciones (IA) cubre este


La construcción de sistemas a partir de cero suele aspecto, al despreocuparse de cómo los sistemas
ser una tarea muy costosa. La integración de funcionan de manera individual, centrándose, en
aplicaciones (IA) cubre este aspecto, al centrarse las formas en que estos interactúan para lograr un
en las formas en que estas aplicaciones interactúan conjunto unificado de funcionalidades, aun más,
evolucionando en la Integración de Aplicaciones la búsqueda de formas más eficientes de
Empresariales (IAE). Más aún, con problemas de integración ha propuesto una evolución conocida
integración tan diversos, los Patrones de como Integración de Aplicaciones Empresariales
Integración Empresarial, proporcionan una (IAE). [2].
solución probada, aunado a la mensajería como
una de las mejores estrategias. IAE puede definirse como el conjunto de
estrategias, metodologías, estándares y
En este artículo trata del patrón de mensajería tecnologías que permiten que los sistemas más
Recipient List con RabbitMQ para el desarrollo de importantes compartan información, procesos y
los requerimientos de comunicación de un sistema funcionalidades, como soporte a las actividades de
de seguridad. la empresa [2].

1. Introducción 2. Patrones de Integración Empresarial


La construcción de sistemas a partir de cero suele A pesar de que los problemas de integración son
ser una tarea costosa y con pocas posibilidades de diversos, Gregor Hohpe y Woolf Bobby notaron
éxito. Una alternativa viable y menos riesgosa es que muchos problemas y sus soluciones son
desarrollar al sistema como un rompecabezas a similares catalogándolos en el libro Enterprise
partir de componentes y aplicaciones probadas. Integration Patterns.
Este planteamiento es válido para la integración
de proyectos y aplicaciones, sin embargo, Los Patrones de Integración Empresarial, o
mientras que las piezas de rompecabezas se hacen Patrones EAI, son útiles no sólo porque
para ensamblarse, los sistemas informáticos rara proporcionan una solución probada para un
vez lo hacen. [1]. problema dado, sino porque también ayudan a
definir y comunicar el problema en sí [3]; sin
embargo, aunque los patrones de integración
ROC&C’2012 – CM-14 PONENCIA RECOMENDADA
representan un gran avance, todas las soluciones
POR EL COMITÉ DE COMUNICACIONES DEL
de integración tienen que lidiar con retos como
IEEE SECCIÓN MÉXICO Y PRESENTADA EN LA
redes lentas y poco fiables con una gran
REUNIÓN INTERNACIONAL DE OTOÑO, ROC&C’2012,
ACAPULCO, GRO., DEL 11 AL 15 DE NOVIEMBRE DEL 2012.
diversidad de aplicaciones con cambios
constantes.

La mensajería es uno de los cuatro enfoques


principales (transferencia de archivos, bases de
datos compartidas, invocación de procesos
remotos y mensajería) [4] que se emplean para
sobrellevar estos retos, en palabras de Hohpe:
“Las arquitecturas basadas en mensajería 3.1. El Patrón Recipient List
asíncrona han demostrado ser la mejor estrategia El patrón Recipient List, abreviado en la figura 2,
para la integración de aplicaciones debido a que define un canal por destino y lo agrega a una lista
permiten una solución débilmente acoplados que de recipientes o destinatarios, el patrón
supera las limitaciones de comunicación a inspecciona los mensajes para determinar con la
distancia, tales como la latencia y la falta de lista él o los destinos que deberá seguir el
fiabilidad.” [5]. mensaje. Este patrón normalmente implementa a
otros patrones como el “Publish/Subscribe” al
Sin embargo, también menciona que: requerir una subscripción de los receptores a uno
o varios de los destinos contenidos en la lista de
“Por desgracia, la mensajería asíncrona no está destinatarios. En otro contexto, las aplicaciones
exenta de peligros. Muchos de los supuestos que encargadas de publicar, envían sus mensajes con
son válidos en el desarrollo individual, no lo son los metadatos necesarios para determinar, a partir
para el desarrolle de aplicaciones síncronas.” de la lista de destinatarios, los destinos a los que
[5]. serán reenviados los mensajes. Este
comportamiento es similar al que genera un gestor
Esencialmente los cuatro enfoques, resuelven los de correo electrónico al encaminar los correos a
mismos problemas y pueden coexistir de tal carpetas según su destinatario o remitente.
manera que cada punto de integración aproveche
el estilo que mejor se adapte. Actualmente existen
algunas tendencia hacia la mensajería asincrónica
que se ha manifestado en una variedad de suites
EAI tales como: Apache Camel [6] y Fuse [7],
RabbitMQ [8], Mule [9], ApacheMIX [10] y
Spring Integration[11] entre otros.
Figura 2. Abreviación del patrón Recipient
En este artículo se aborda el patrón de mensajería List.
“Recipient List” [12] con el Framework
RabbitMQ implementándolo en su variante 3.2. El Framework RabbitMQ
“publish/subscribe” para el desarrollo de los Álvaro Videla, uno de los autores del libro
requerimientos de comunicación de un sistema de RabbitMQ in Action [14], lo describe en su charla
seguridad basado en alertas. “Reduciendo el Acoplamiento entre Aplicaciones
con RabbitMQ”, para las Jornadas Symfony 2011
3. Message Router [15] [16], como:
El Message Router es uno de los patrones EAI
asociados a la mensajería [13], este patrón posee “Un sistema de mensajería empresarial hecho
alrededor de diez variantes e implementa al para cargas grandes, escrito en Erlang/OTP [22]
Recipient List como uno de ellos; los patrones que implementa el protocolo AMQP [17] sobre el
derivados del Message Router examinan el envió de mensajes altamente escalable”.
contenido del mensaje para encaminarlo a una
ruta. La idea central en el modelo de mensajería con
RabbitMQ es que “nunca” el productor envíe
Esta representación, que también se conoce con el directamente los mensajes a un canal. A decir
nombre Content-Based Router, es la más básica y verdad en varias ocasiones no se sabe si un
mínima (figura 1). mensaje se entregará a un canal, ya que los
productores solo pueden enviar mensajes a los
Exchanges Intercambiadores.

Un Exchange recibe los mensajes de los


productores por un extremo y por el otro los
entrega a los canales, por que el Exchange sabe
exactamente qué hacer con los mensajes que
recibe. Los Exchanges usan reglas o “bindings” y
Figura 1. Content-Based Router. son las relaciones entre los Exchanges y los
canales, estas reglas puede traducirse como: el
interés de un canal en los mensajes que recibe un
Exchange proporcionando un nivel más bajo de • La respuesta de los clientes adyacentes solo
acoplamiento. deben de llegar a la central y al cliente que género
el evento.
RabbitMQ cuenta con cuatro tipos de Exchange:
topic, headers, fanout y direct, siendo este último • Todos los eventos a excepción de los mensajes
el que se aborda en este trabajo. de conexión serán guardados en un archivo
eventos.log.
El Exchange direct, nos permite filtrar el mensaje
en función de su contenido para entregarlo de
forma directa (figura 3). El direct se apoya en una El esquema de integración es diseñado en tres
llave o binding key que es conocida como la partes: un servidor de mensajería o bróker que
clave de ruteo del mensaje. funge como buffer para los mensajes en
RabbitMQ, un generador de alertas o productor y
un receptor o consumidor, en donde las
aplicaciones deberán implementar el rol de
productor, consumidor o ambos según el contexto.

4.1. El servidor de Mensajería


Esta parte del esquema de integración corresponde
a la puesta en marcha del servicio de mensajería
RabbitMQ, es decir, la instalación del mismo [18].
Para el ejemplo expuesto este servicio no requiere
Figura 3. Exchange direct. de ninguna configuración adicional a la que carga
por defecto. En este caso son las aplicaciones las
que indican la funcionalidad requerida.
4. La Implementación
El caso de estudio corresponde a los 4.2. Implementación del Productor
requerimientos de comunicación para un sistema El publicador es la parte de la aplicación
de seguridad basado en mensaje y alertas. Este encargada de enviar alertas y avisos al servidor de
sistema ocupa un mecanismo de comunicación mensajería para su posterior manejo.
entre dos aplicaciones principales; la aplicación
manager o central monitorea propaga los mensajes En este punto el servidor de mensajería no tiene
producidos por aplicaciones tipo clientes ninguna regla de comportamiento definido por
distribuidos geográficamente, estas aplicaciones defecto. La implementación de productor es
clientes actualizan constantemente su estado para quien, de primera instancia, asigna estas reglas, en
alertar en caso de algún incidente o evento. el siguiente código, figura 4, se escribe un método
en lenguaje Java que cumple con ese propósito.
A partir de esta descripción general se pueden
obtener algunos requisitos de integración: Este método, después de las sentencias que se
encargan de conexión (líneas 3 a 5), declara:

• Envió de alertas a los clientes desde la central. • Un canal (línea 6).


• Un Exchange llamado "alertas" de tipo "direct"
• Envió de alertas a la central desde los clientes. (línea 8).

• Envió de mensajes de conexión de clientes, para Estas sentencias son parte de la configuración
a la central para verificar su estatus de online. asignada al RabbitMQ. Justo después de esto, se
envía el mensaje (línea 13) al recién creado canal.
• Una alerta generada por un cliente debe ser
enviada tanto a la central como a los clientes Evidentemente las aplicaciones pueden hacer uso
designados como adyacentes. de este método para propagar sus propios eventos
en forma de mensajes, sin embargo, estos
• El acuse de online solo debe de llegar a la mensajes van etiquetados con un “routingKey”
central. para lograr un criterio de difusión (línea 13).
1: public void sentMessage(String msg, String key) throws
java.io.IOException
2: {
3: ConnectionFactory factory = new ConnectionFactory();
4: factory.setHost("localhost");
5: Connection connection = factory.newConnection();
6: Channel channel = connection.createChannel();
7:
8: channel.exchangeDeclare("alertas", "direct");
9:
10: String routingKey = key;
11: String message = msg;
12:
13: channel.basicPublish("alertas", routingKey, null, message.getBytes());
14:
15: System.out.println("Sent '" + routingKey + "':'" + message + "'");
16:
17: channel.close();
18: connection.close();
19: }

Figura 4. Abreviación del patrón Recipient List.

1: public void reciveMsg(String... bindigs) throws java.io.IOException,


java.lang.InterruptedException
2: {
3: ConnectionFactory factory = new ConnectionFactory();
4: factory.setHost("localhost");
5: Connection connection = factory.newConnection();
6: Channel channel = connection.createChannel();
7:
8: channel.exchangeDeclare("alertas", "direct");
9: String queueName = channel.queueDeclare().getQueue();
10:
11: for(String key : bindigs){
12: channel.queueBind(queueName, "alertas", key);
13: }
14:
15: System.out.println("[*] Waiting for messages.");
16:
17: QueueingConsumer consumer = new QueueingConsumer(channel);
18: channel.basicConsume(queueName, true, consumer);
19:
20: while (true) {
21: QueueingConsumer.Delivery delivery = consumer.nextDelivery();
22: String message = new String(delivery.getBody());
23: String routingKey = delivery.getEnvelope().getRoutingKey();
24:
25: System.out.println("Received '" + routingKey + "':'" + message
+ "'");
26: }
27: }

Figura 5. Abreviación del patrón Recipient List.


Figura 6. Detalle del Patrón Recipient List.

4.3. Implementación del Consumidor El éxito de todo proyecto de integración depende


El Consumidor por otra parte, es el encargado de en gran medida de la elección del patrón, los
consumir los mensajes entregados por los patrones al igual que los patrones de diseño
Exchanges a los diferentes canales. Ahora es el usados habitualmente en la programación
Consumidor el que tiene la responsabilidad de orientada a objetos proporcionan una pauta en la
agregar las reglas o bindings que le entreguen los mayoría de los proyectos de integración. Hoy en
mensajes en los que está interesado, estas reglas día, se cuenta con muchas herramientas enfocadas
también se basan en el criterio “routingKey”, esta a la integración, Apache Camel, Fuse, Mule,
reacción es análoga a seguir a algún contacto en Spring Integration, ActiveMQ y RabbitMQ son
Twitter o Facebook. algunos ejemplos Open Sourse.

El código propuesto en la figura 5, es muy similar Se propone el acercamiento a la programación


al anterior (figura 4), sin embargo al llegar a la dirigida por procesos con Business Process
línea 11 se percibe un ciclo que subscribe al Management (BPM), SOA (Service Oriented
consumidor a los nombres contenidos en el Architecture) y con herramientas como Apache
arreglo bindigs, declarado en la línea 1. Asimismo ServiceMix [10], Bizagi [19], Activiti [20] y
encontramos en la línea 9, un método capaz de BizTalk Server [21].
regresar el nombre de la cola que de forma
“temporal” es generada para entregar los mensajes Es deseable la incorporación del protocolo AMQP
de los “routingKey’s” correspondientes. y RabbitMQ a nuestros proyectos de integración
en un esfuerzo por estandarizar los protocolos de
En la figura 6, podemos observar la figura que mensajería.
explica la implementación del patrón Recipient
List se hace evidente como un solo mensaje puede 6. Referencias
ser enviado a diferentes canales. Los métodos [1] Ibsen, C. Anstey, J., Camel in Action,
sentMessage y reciveMsg, brindan un mecanismo Manning, ISBN: 9781935182368, USA,
para que los productores y consumidores puedan December, 2010, pp. 3.
enviar y leer solo los mensajes pertinentes a su [2] Vázquez, O, “INTEGRACIÓN DE
rol. APLICACIONES EN LAS EMPRESAS”,
Industrial/Vol. XXVII/No. 1/2006, Instituto
5. Conclusiones Superior Politecnico José Antonio Echeverria,
Los productores pueden enviar mensajes 2006, ISSN: 1815-5936.
categorizados, mientras que los consumidores [3] Ibsen, C. Anstey, J., Camel in Action,
pueden suscribirse solo a las categorías en las que Manning, ISBN: 9781935182368, USA,
están interesados. December, 2010, pp. 5.
[4] Enterprise Integration Patterns, Hohpe, Woolf,
2003, Addison-Wesley, pp 12.
[5] Enterprise Integration Patterns, Hohpe, Woolf, Ing. Oscar Beltrán Gómez
2003, Addison-Wesley, in www.eaipatterns.com.
[6] Apache Camel, Home Page: Ingeniero en Sistemas
http://camel.apache.org/, Julio 2012. Computacionales por el
[7] FuseSource Integration Everywhere, Home Instituto Tecnológico de
Page: http://fusesource.com/, Julio 2012. Chihuahua II, Aspirante a
[8] RabbitMQ: Spring Source, Home Page: grado en la Maestría en
http://www.rabbitmq.com/, Julio 2012. Ingeniería en Sistemas
[9] MuleSoft, Home Page: Computacionales por la Facultad de Ingeniería de
http://www.mulesoft.org/, Julio 2012. la Universidad Autónoma de Chihuahua.
[10] Apache ServiceMix, Home Page: Certificaciones en: Sun Certified Java
http://servicemix.apache.org/index.html, Julio Programmer SE 6, Instructor CISCO CCNA
2012. EXPLORATION 4 para los módulos 1, 2 y 3 y
[11] Spring Integration, Home Page: Course Certification to The Carnegie Mellon
http://www.springsource.org/spring-integration/, University Robotics Academy Vex. Actualmente
Julio 2012. se desempeña como docente en la Universidad
[12] Recipient List Pattner, Home Page: Autónoma de Chihuahua.
http://www.eaipatterns.com/RecipientList.html,
Julio 2012.
[13] Introduction to Message Routing, Home
Page: M.I. Arión Juárez Menchaca
http://www.eaipatterns.com/MessageRoutingIntro.
html, Julio 2012. Estudios de licenciatura y
[14] Videla, A. and Williams, J., RabbitMQ in posgrado en la Facultad de
Action, Manning, ISBN: 9781935182979,USA, Ingeniería (FI) de la Universidad
April, 2012. Autónoma de Chihuahua
[15] Jornadas Symfony 2011 in Home Page: (UACH). Conocimiento en las
http://desymfony.com/. áreas de sistemas de programación, diseño gráfico
[16] Videla, A., Reduciendo el Acoplamiento y soporte de sistemas de cómputo en las
entre Aplicaciones con RabbitMQ, Desymfony plataformas de Windows y Mac OS X.
2011, in Actualmente Coordinador de Educación en Línea
http://www.youtube.com/watch?v=vpuqMEu96U de la FI de la UACH.
U&feature=plcp.
[17] AMQP: Advanced Message Queuing
Protocol, Home Page:
http://www.amqp.org/about/what. M.I. José Alberto
[18] Downloading and Installing RabbitMQ, Domínguez Terrazas
Home Page:
http://www.rabbitmq.com/download.html. Maestro en Ingeniería en
[19] Bizagi:Business Process Management Sistemas Computacionales
(BPMS), Home Page: http://www.bizagi.com/. por la Facultad de Ingeniería
[20] Activiti BPM Platform, Home Page: de la Universidad Autónoma
http://activiti.org/. de Chihuahua (U.A.Ch.) (2006-2008) e Ingeniero
[21] BizTalk Server, Home Page: en Sistemas Computacionales en Hardware por
http://www.microsoft.com/biztalk/en/us/default.as parte de la Facultad de Ingeniería de la U.A.Ch.
px. (1995-1999) Ha desempeñado puestos tales como:
[22] Erlang Programming Language, Home Page: Desarrollador de Software en ADC Systemas,
www.erlang.org/. S.A. (2001-2002), Soporte Técnico y
Desarrollador de Software en forma de
outsourcing a diversas empresas (2002 – a la
fecha), Jefe del Centro de Informática de la
Facultad de Ingeniería (2005 – a la fecha). Imparte
diversos cursos dentro de la Facultad de
Ingeniería.