Qpid Proton:idle_timeout配置

时间:2017-12-15 01:27:18

标签: connection containers default-value qpid idle-timer

我使用的是Qpid Proron 0.18.1版本。 idle_timeout正在打印出来, connection.idle_timeout() : 15000。我无法追溯到设置默认值15000的代码。此外,当我在容器中更改它时,如下所示:

c.connect(conn_url, co.idle_timeout(proton::duration::FOREVER));

这使经纪人在一分钟后失时。然而,

c.connect(conn_url, co.idle_timeout(proton::duration::SECOND));

根本没有使代理超时,即使我认为在代理空闲一秒之后这应该超时。

如果有人可以向我解释idle_timeout()以及是否有可能更改其默认值,那就太棒了。

谢谢!

2 个答案:

答案 0 :(得分:1)

首先,有关AMQP idle-timout 的一些一般信息:

我认为你可能会对idle_timeout应该做什么产生误解(名称可能有点误导)。

此设置旨在检测您所连接的对等方是否已停止响应,即使它仍在套接字级别连接。使用的超时值应根据您希望等待检测到您的对等方不再响应您的时间来设置。

它的作用是请求您连接的对等体在idle_timeout期间发送至少1个AMQP帧。如果由于消息传输等而没有发送帧,那么它应该发送一个空帧。通常,对等体将在空闲超时时间的一半发送这些保持活动心跳帧,以确保网络状况不会导致虚假超时。

知道通信的每一半都有自己的空闲超时值也很重要。也就是说,从客户端到代理的通信将具有与另一方向的通信不同的空闲超时值。

现在来看看你的具体问题:

  

我使用的是Qpid Proron 0.18.1版本。 idle_timeout打印出来,即connection.idle_timeout():15000。我无法追溯到设置默认值15000的代码。

您在这里看到的是连接的另一端设置的idle_timeout值。它告诉质子实现每15秒发送至少1帧,否则它会认为连接超时。无需您在使用的C ++实现中执行任何操作,就会发生这种情况。

  

c.connect(conn_url, co.idle_timeout(proton::duration::FOREVER));

     

这使得经纪人在一分钟后停工。

这里的代码有效地告诉代理永远不会发送任何 keep-alive 帧 - 它实际上与完全不设置属性相同,因为默认情况下不发送框架。

我非常确定这不会使代理超时 - 正如我上面所解释的那样,它为此设置了错误方向的idle-timeout。我猜它有一个完全独立的配置,因为你没有在一分钟内做任何事情而且想要节省资源 - 我似乎记得Azure Servicebus会这样做。

  

c.connect(conn_url, co.idle_timeout(proton::duration::SECOND));

     

根本没有使代理超时,即使我认为在代理空闲一秒之后这应该超时。

这告诉代理每秒发送至少一个帧,如果一秒钟没有发生任何事情,它就不会告诉代理断开连接。如果你和以前一样使用同一个经纪人,我不确定为什么它不会在同一分钟后超时,但无论如何,如果经纪人发生不好的事情,这只会超时。

答案 1 :(得分:0)

我对此并不了解,但是,我发现的内容如下,希望这有帮助......

  

问。 如果有人可以向我解释有关idle_timeout()和的信息,那将会很棒   如果有可能更改其默认值。

下面的 idle_timeout()说明:

  

设置空闲超时。

     

默认为无超时。

     

如果设置,如果本地对等方没有收到AMQP帧,它将断开连接   持续时间超过持续时间。也被称为"心跳",   即使存在实时TCP,这也是一种检测死对等体的方法   连接。

参考: Qpid Proton C++ API - idle_timeout()(15 / DEC / 2017)

更改其默认值。

  

创建连接的选项。

选项可以"链接"像这样:

c = container.connect(url,connection_options()。handler(h).max_frame_size(1234)); 您还可以使用常用设置创建选项对象,并将其用作具有大致相同设置的不同连接的基础:

connection_options opts;
opts.idle_timeout(1000).max_frame_size(10000);
c1 = container.connect(url1, opts.handler(h1));
c2 = container.connect(url2, opts.handler(h2));

正常值语义:复制或分配创建选项的单独副本。

参考: Qpid Proton C++ API - connection_options & idle_timeout(15 / DEC / 2017)