Qpid 质子:idle_timeout 配置

Qpid Proton: idle_timeout configuration

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

谢谢!

我对此了解不多,但是,我发现如下,希望对您有所帮助...

Q. It would be great if someone can explain me about idle_timeout() and if there is a possibility to change its default value.

下面的idle_timeout()说明:

Set the idle timeout.

The default is no timeout.

If set, the local peer will disconnect if it receives no AMQP frames for an interval longer than duration. Also known as "heartbeating", this is a way to detect dead peers even in the presence of a live TCP connection.

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

更改其默认值。

Options for creating a connection.

选项可以像这样“链接”:

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)

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

我想你可能对 idle_timeout 应该做什么有误解(这个名字可能有点误导)。

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

它的作用是请求您连接的对等方在 idle_timeout 期间内发送至少 1 个 AMQP 帧。如果由于消息传输等原因没有发送帧,那么它应该发送一个空帧。通常,对等方将在空闲超时期限的一半发送这些 keep-aliveheartbeat 帧,以确保网络条件不会导致在虚假超时中。

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

现在来看你的具体问题:

I am using Qpid Proron 0.18.1 version. The idle_timeout is printing out to be, connection.idle_timeout() : 15000. I am not able to trace back to the code where the default value 15000 is set.

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

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

This is making the broker time out after a minute.

这里的代码实际上是告诉代理永远不要发送任何 keep-alive 帧——这实际上与不设置 属性 相同全部,因为默认不发送帧。

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

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

is not making the broker timeout at all even though I thought that this should timeout after a second of the broker being idle.

这是告诉broker每秒至少发送一帧,不是告诉broker如果一秒钟内没有任何反应就断开连接。如果您使用与以前相同的经纪人,我不确定为什么它不会在同一分钟后超时,但无论如何这只会在经纪人出现问题时超时。