0

我使用的是 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()以及是否有可能更改其默认值,那就太好了。

谢谢!

4

2 回答 2

2

首先,关于 AMQP idle-timeout 的一些一般信息:

我想你可能对 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));

这使经纪人在一分钟后超时。

这里的代码实际上是告诉代理永远不要发送任何保持活动的帧 - 实际上与根本不设置属性相同,因为默认情况下不发送帧。

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

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

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

这是告诉代理每秒至少发送一个帧,而不是告诉代理如果一秒钟内没有任何反应就断开连接。如果您使用与以前相同的代理,我不确定为什么它不会在同一分钟后超时,但无论如何,只有在代理发生不好的情况下才会超时。

于 2018-02-01T22:13:15.083 回答
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)

于 2017-12-15T01:47:06.463 回答