【问题标题】:amqp assertQueue bork a connection meaningamqp assertQueue bork 连接意义
【发布时间】:2017-11-06 19:22:37
【问题描述】:

在 amqp 的 assertQueue API 文档中,它指出:

断言队列存在。给定相同的参数,此操作是幂等的;但是,如果队列已经存在但具有不同的属性(参数字段中提供的值可能会或可能不会计入 borking 目的;检查 borker 的,我的意思是经纪人的文档),它将使通道失效。

http://www.squaremobius.net/amqp.node/channel_api.html#channel_assertQueue

我在问这个频道是什么意思。我尝试了谷歌,但找不到任何相关内容。

【问题讨论】:

    标签: node.js rabbitmq amqp


    【解决方案1】:

    Bork:英文意思是阻碍某物。

    根据问题中的文档,它说

    但是,如果队列已经存在但有 不同的属性

    这意味着如果您尝试创建一个与已经退出的通道具有相同属性的通道,则不会发生任何事情,因为它是 idempotent(意味着重复相同的操作而没有不同的结果,例如 REST API GET 请求它为 id 说 123 获取数据,除非更新,否则每次都会返回相同的数据,一个解释无能概念的非常有趣的视频),但是如果您尝试创建一个名称相同但属性不同的频道,则频道创建应为“ borked”即被阻塞。

    在下面的代码中,我们再次创建通道,

     var ok0 = ch.assertQueue(q, {durable: false});// creating the first time
     var ok1 = ch.assertQueue(q, {durable: true});// creating the second time again with different durable property value
    

    它抛出错误

    “PRECONDITION_FAILED - 队列 'hello' 的不等价参数 'durable' vhost '/': 收到 'true' 但当前为 'false'"

    这意味着您正在尝试创建具有不同属性的相同通道,即持久属性与现有通道不同,因此它已被破坏。

    [2]:@Like Bakken 的回答

    【讨论】:

    • 绝妙的答案!这应该是公认的答案,因为它与当前接受的答案不同,实际上回答了 OP 提出的问题。顺便说一句,我很欣赏技术文档中通常没有幽默感的幽默,但在这种情况下,它实际上使我脱离了编码,因为我不得不查找一个对文档没有任何价值的术语。
    • 这个答案中缺少的是:如果捕获到第二个断言产生的错误,队列会继续工作还是我们会看到一些副作用?
    【解决方案2】:

    RabbitMQ 团队会监控 this mailing list,并且有时只会在 StackOverflow 上回答问题。

    话虽如此,您是否尝试过两次调用assertQueue,第二次使用不同的属性?您会很快回答自己的问题。

    我使用this code 创建了这个测试程序:

    #!/usr/bin/env node
    
    var amqp = require('amqplib');
    
    amqp.connect('amqp://localhost').then(function(conn) {
      return conn.createChannel().then(function(ch) {
        var q = 'hello';
        var ok0 = ch.assertQueue(q, {durable: false});
        return ok0.then(function(_qok) {
            var ok1 = ch.assertQueue(q, {durable: true});
            return ok1.then(function(got) {
                console.log(" [x] got '%s'", got);
                return ch.close();
            });
        });
      }).finally(function() { conn.close(); });
    }).catch(console.warn);
    

    然后,启动 RabbitMQ 并运行您的测试代码。您应该会看到如下输出:

    $ node examples/tutorials/assert-borked.js
    events.js:183
          throw er; // Unhandled 'error' event
          ^
    
    Error: Channel closed by server: 406 (PRECONDITION-FAILED) with message "PRECONDITION_FAILED - inequivalent arg 'durable' for queue 'hello' in vhost '/': received 'true' but current is 'false'"
        at Channel.C.accept
    

    【讨论】:

    • 这实际上并没有回答问题。 “博克”是什么意思?
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2016-02-28
    • 2013-03-18
    相关资源
    最近更新 更多