如何在RabbitMQ中启用阻止连接通知扩展

时间:2016-12-20 20:10:34

标签: node.js rabbitmq

我正在尝试在RabbitMQ上使用Nodejs模块blocked来使用unblockedamqplib个频道事件。我的理解是,如果系统资源已经达到"警报,那么RabbitMQ将向生产者发送连接阻止命令。州。我的目的是利用这个来确定生产者是否应该继续创造一份工作,或者回复一下"稍后再试一次"。

amqplib docs:http://www.squaremobius.net/amqp.node/channel_api.html#model_events

以下是我正在使用的软件版本:

  • RabbitMQ 3.6.6,Erlang R16B03
  • NodeJS 6.9.2
  • amqplib ^ 0.5.1(节点模块)
  • Ubuntu 14.04

我尝试过的事情

我的nodejs代码:

var amqp = require('amqplib');
amqp.connect('amqp://localhost').then((connection) => {
    return connection.createChannel();
}).then((channel) => {
    channel.on('blocked', (reason) => {
        console.log(`Channel is blocked for ${reason}`);
    });
    channel.on('unblocked', () => {
        console.log('Channel has been unblocked.');
    });

    return channel.assertQueue('myQueue', {
        durable : true,
        // This doesn't seem to do anything
        arguments : {
            "connection.blocked" : true
        }
    }).then(() => {
        channel.sendToQueue('myQueue', new Buffer('some message'), {
            persistent : true
        });
    });
});

据我所知,此特定功能是AMQP协议的扩展,需要启用/声明。我对erlang配置语法不是很熟悉。使用示例配置,我构建了一个类似于:

的配置
[{rabbit, [
    {"server-properties", [
        {"compatibilities", {
            { "connection.blocked", true }
        }}
]}

根据此处的文档:https://www.rabbitmq.com/consumer-cancel.html#capabilities

  

"要接收这些通知,客户必须出示   功能表在其客户端属性中有一个键   connection.blocked和布尔值true。查看功能   部分了解更多细节。我们支持的客户表示   默认情况下,此功能提供了一种注册处理程序的方法   connection.blocked和connection.unblocked方法。"

然后使用service rabbitmq-server restart重新启动服务器。

这不会使服务器崩溃,但事件也不会触发。我希望在系统资源不足的情况下连接应该成为阻塞。 RabbitMQ文档有一个关于Capabilities的更多信息的链接,但链接已经死了,我不知道还有什么可以尝试。

1 个答案:

答案 0 :(得分:0)

blockedunblocked位于connection而不是channel

在您的示例中:connection.on('blocked', console.log)connection.on('unblocked', () => console.log('unblocked'))

要测试它,只需运行:rabbitmqctl set_vm_memory_high_watermark 0.000001并向您的队列发送新消息。

默认情况下启用

compatibilitiesamqplib会通知服务器connection.blocked。这里什么都不应该做。