Solución:
¿Puedo hacer que cada consumidor reciba los mismos mensajes? Es decir, ¿ambos consumidores reciben el mensaje 1, 2, 3, 4, 5, 6? ¿Cómo se llama esto en AMQP / RabbitMQ? ¿Cómo se configura normalmente?
No, no si los consumidores están en la misma cola. De la guía de conceptos AMQP de RabbitMQ:
Es importante comprender que, en AMQP 0-9-1, los mensajes tienen un equilibrio de carga entre los consumidores.
Esto parece implicar que El comportamiento de round-robin dentro de una cola es un datoy no configurable. Es decir, se requieren colas separadas para que varios consumidores manejen el mismo ID de mensaje.
¿Esto se hace comúnmente? ¿Debería hacer que el intercambio enrute el mensaje en dos colas separadas, con un solo consumidor, en su lugar?
No, no lo es, no es posible una sola cola / múltiples consumidores con cada consumidor manejando el mismo ID de mensaje. De hecho, es mejor que el intercambio enrute el mensaje en dos colas separadas.
Como no necesito un enrutamiento demasiado complejo, intercambio de fanout manejará esto muy bien. No me centré demasiado en los intercambios antes, ya que node-amqp tiene el concepto de un ‘intercambio predeterminado’ que le permite publicar mensajes en una conexión directamente, sin embargo, la mayoría de los mensajes AMQP se publican en un intercambio específico.
Aquí está mi intercambio de fanout, tanto para enviar como para recibir:
var amqp = require('amqp');
var connection = amqp.createConnection({ host: "localhost", port: 5672 });
var count = 1;
connection.on('ready', function () {
connection.exchange("my_exchange", options={type:'fanout'}, function(exchange) {
var sendMessage = function(exchange, payload) {
console.log('about to publish')
var encoded_payload = JSON.stringify(payload);
exchange.publish('', encoded_payload, {})
}
// Recieve messages
connection.queue("my_queue_name", function(queue){
console.log('Created queue')
queue.bind(exchange, '');
queue.subscribe(function (message) {
console.log('subscribed to queue')
var encoded_payload = unescape(message.data)
var payload = JSON.parse(encoded_payload)
console.log('Recieved a message:')
console.log(payload)
})
})
setInterval( function() {
var test_message="TEST "+count
sendMessage(exchange, test_message)
count += 1;
}, 2000)
})
})
Solo lee el tutorial de rabbitmq. Publica un mensaje para intercambiar, no para hacer cola; luego se enruta a las colas adecuadas. En su caso, debe vincular una cola separada para cada consumidor. De esa forma, pueden consumir mensajes de forma completamente independiente.
Las últimas respuestas son casi correctas: tengo toneladas de aplicaciones que generan mensajes que deben llegar a diferentes consumidores, por lo que el proceso es muy simple.
Si desea que varios consumidores reciban el mismo mensaje, realice el siguiente procedimiento.
Cree varias colas, una para cada aplicación que va a recibir el mensaje, en cada propiedad de la cola, “vincule” una etiqueta de enrutamiento con el intercambio amq.direct. Cambie su aplicación de publicación para enviar a amq.direct y use la etiqueta de enrutamiento (no una cola). AMQP luego copiará el mensaje en cada cola con el mismo enlace. Funciona de maravilla 🙂
Ejemplo: digamos que tengo una cadena JSON que genero, la publico en el intercambio “amq.direct” usando la etiqueta de enrutamiento “new-sales-order”, tengo una cola para mi aplicación order_printer que imprime el pedido, tengo un cola para mi sistema de facturación que enviará una copia del pedido y facturará al cliente y tengo un sistema de archivo web donde archivo pedidos por razones históricas / de cumplimiento y tengo una interfaz web de cliente donde los pedidos se rastrean a medida que ingresa otra información una orden.
Así que mis colas son: order_printer, order_billing, order_archive y order_tracking. Todas tienen la etiqueta vinculante “new-sales-order” ligada a ellas, las 4 obtendrán los datos JSON.
Esta es una forma ideal de enviar datos sin que la aplicación de publicación sepa o se preocupe por las aplicaciones receptoras.