我正在尝试在RabbitMQ上使用Nodejs模块blocked
来使用unblocked
和amqplib
个频道事件。我的理解是,如果系统资源已经达到"警报,那么RabbitMQ将向生产者发送连接阻止命令。州。我的目的是利用这个来确定生产者是否应该继续创造一份工作,或者回复一下"稍后再试一次"。
amqplib docs:http://www.squaremobius.net/amqp.node/channel_api.html#model_events
以下是我正在使用的软件版本:
我的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
的更多信息的链接,但链接已经死了,我不知道还有什么可以尝试。
答案 0 :(得分:0)
blocked
和unblocked
位于connection
而不是channel
。
在您的示例中:connection.on('blocked', console.log)
和connection.on('unblocked', () => console.log('unblocked'))
。
要测试它,只需运行:rabbitmqctl set_vm_memory_high_watermark 0.000001
并向您的队列发送新消息。
compatibilities
,amqplib
会通知服务器connection.blocked
。这里什么都不应该做。