Bridge v7 - BRIDGE API REST - RabbitMQ - Exchange-múltiples colas con binding




REVISIONES

Fecha

Versión

Descripción

Autor

 

1.0Creación del documento



CONTENIDO


1-Alcance

Versión API 7.2 en Adelante.


2-Compatibilidad

Esta funcionalidad es totalmente compatible con versiones anteriores de API, y no necesita ninguna configuración extra.


3-Aclaraciones

En las versiones anteriores se publicaban los mensajes directamente en las Queues (colas).


A partir de este desarrollo API crea automáticamente un EXCHANGE (repartidor) por cada 'antigua queue'.

Y al mismo tiempo genera una queue con el mismo nombre del exchange escuchando al repartidor homónimo (con esto se mantiene la compatibilidad con versiones anteriores).


Ahora API publicará un mensaje en el exchange con un routing key: nombre del exchange + . + API (ej: transactions.API),
el cual reparte este mensaje a todas las colas que lo estén escuchando (binding a: nombre del exchange + .# [ej: binding a transactions.#].


Se pueden observar en el manager de rabbit, la pestaña Exchanges... y la pestaña Queue, donde se puede ver el Binding.



Para clientes que sólo consuman un único mensaje de rabbit, no es necesario generar nuevas colas.
Para clientes que necesiten consumir el mismo mensaje varias veces o por diferentes sistemas, deberán crear las colas extras necesarias para cada sistema. Ya que el consumo de una cola hará desaparecer los mensajes que tenía.

4-Crear nuevas colas para escuchar al exchange

Todo nuevo sistema que desee consumir un mensaje de rabbit. Deberá crear su propia cola, nomenclatura propuesta: (nombre de exchange + _ o . + nombre del sistema externo) y deberá realizar el binding al exchange correspondiente y colocando como routing key el mismo nombre del exchange + .#. (VER IMAGEN ABAJO, sección Bindings) De esa manera todo mensaje publicado a un exchange será repartido a la cola por defecto que crea API (mismo nombre que el exchange) y a todas las colas que tengan el binding configurado hacia ese exchange.

Ejemplo:

Se toma como punto de partida la cola "InventoryReturn"


Se va a agregar una cola que se llame "InventoryReturn.prueba", para eso hay que ingresar en "Queues" y luego abajo de las colas listadas presionar el botón "Add a new queue":


Se completa el campo "Name" con el nombre de la queue y luego se presiona "Add queue"


Luego vamos a la cola que fue creada haciendo doble click sobre la misma:

y completar de la siguiente manera: FROM: nombre del exchange

ROUTING KEY: nombre de exchange + .#

Luego clickear en "Bind" para que quede del siguiente modo:


Luego para verificar vamos a la parte de "Exchanges", visualizamos la cola "InventoryReturn" y abrirla con click:

Debe figurar de este modo:



5-Ejemplo en código Node.js para crear nuevas colas y escuchar exchange desde un sistema externo


Creación de Queue
public createChannel(name: string, options: any = {durable: true}): Promise<Channel> {
        return new Promise((resolve, reject) => {
            return this.getConnection().then((conn: Connection) => {
                return conn.createChannel((err: any, channel: Channel) => {
                    if (err) {
                        return reject(err);
                    }
                    channel.assertQueue(name+'.SISTEMAEXTERNO', options);
                    //para sistema de EXCHANGE
                    channel.bindQueue(name+'.SISTEMAEXTERNO', name,name+'.#');
                    logger.debug('Nos conectamos a la cola ' + name + ' con éxito ..a espera de novedades !!')
                    return resolve(channel)

                })
            })
        })
    }

Aclaraciones:

channel.assertQueue(name+'.SISTEMAEXTERNO', options); 
Se le indica que el channel queda asociado a un queue llamado nombre.sistemaexterno y se le agregan las opciones de cola que se deseen.

channel.bindQueue(name+'.SISTEMAEXTERNO', name,name+'.#');
Se realiza el binding de el queue nombre.sistemaexterno, con el exchange nombre, con el bindingKey: nombre.#