Javascript AMQP Rabbitmq Nodejs—每次订阅服务器关闭时创建的附加发布服务器
目前我有以下情况:Javascript AMQP Rabbitmq Nodejs—每次订阅服务器关闭时创建的附加发布服务器,javascript,node.js,rabbitmq,amqp,Javascript,Node.js,Rabbitmq,Amqp,目前我有以下情况: publisher.js: var queue_connection = new amqp.createConnection( { host: config.rabbitmq.host, port: config.rabbitmq.port } ); queue_connection.on( 'ready', function () { var exchange = queue_connection.exchange( 'http_worker', { typ
publisher.js:
var queue_connection = new amqp.createConnection( { host: config.rabbitmq.host, port: config.rabbitmq.port } );
queue_connection.on( 'ready', function () {
var exchange = queue_connection.exchange( 'http_worker', { type: 'topic' } );
exchange.on( 'open', function(){
setInterval(function(){
exchange.publish( 'AZ', 'This is test message' );
logger.info( 'AZ message pushed' );
}, 1000);
})
});
subscriber.js:
var connection = amqp.createConnection({ host: config.rabbitmq.host, port: config.rabbitmq.port });
connection.on( 'ready', function () {
connection.queue( 'AZ', function ( q ) {
q.bind( 'http_worker', 'AZ' );
q.subscribe(function ( message ) {
console.log(unescape( message.data ))
});
});
});
上面的例子很好用。当我启动publisher.js和subscriber.js时,subscriber将接收到没有任何问题的消息。 但若我关闭订阅服务器,并再次启动它(不关闭并启动publisher.js),订阅服务器将同时开始接收3条相同的消息
- 我想这是因为publisher.js中有3个回调,但我不明白为什么每次订户宕机时都会调用这些回调
- 我怎样才能防止这种情况发生?rabbitmq/amqp是否有任何选项可以强制发布服务器等待订阅服务器重新连接
- 此外,是否可以在不丢失队列中的消息的情况下实现这一点,该队列在订阅服务器关闭时排队
- 当您先启动订阅服务器,然后启动发布服务器(反之亦然)时,是否存在差异。如何工作,谁需要创建队列、订阅者或发布者
编辑: 基于:
队列和交换的默认设置是,当没有消费者(用于队列)或队列(用于交换)绑定到它们时(在您的情况下)自动删除它们
添加“autoDelete:false”解决了一个问题。队列和交换的默认设置是,当没有消费者(用于队列)或队列(用于交换)绑定到它们时(在您的情况下),会自动删除它们 您可以看到,添加错误事件处理程序时:
queue_connection.on('error', console.log);
当这种情况发生时,RabbitMQ关闭连接,amqp
驱动程序重新连接,它重新发出ready
事件,然后您重新创建交换
但是,前一个exchange实例(来自第一个连接)仍在运行,并且一直在发布消息(这显然是有效的,尽管我怀疑消息被删除)
因此,在第一次重新连接之后,您将有两个发布者发送消息。断开订阅服务器的连接,获取错误,重新连接,然后启动第三个发布服务器。等等
您可能需要跟踪连接的状态,以便确保在重置连接时清除所有exchange或队列实例。确实如此。添加“autoDelete:false”作为exchange选项之一似乎可以解决此问题。