根据http://cumulocity.com/guides/reference/real-time-notifications/,发起握手以接收实时通知的客户可以在其请求正文中包含建议。此建议可以具有超时("发送连接消息和服务器响应之间的最长时间(以毫秒为单位)。")和间隔( "服务器将关闭会话的时间段,如果没有收到来自客户端的下一个连接消息。")。我不理解这些参数以及它们如何适用于我的长轮询连接。
如果我们将它与SmartREST通知进行比较,我们发现它应该以相反的方式工作,恕我直言更有意义:服务器将建议发送到客户端,告诉它应该如何配置自己。在这种情况下的含义可能仍然有点含糊不清,但至少处理可能更直接(=只是服务器建议):
为什么是"建议方向"在两种情况下相反?如何(如果有的话)我应该使用建议进行定期实时通知握手?
非常感谢您对此的任何澄清。
答案 0 :(得分:1)
[免责声明:我是CometD领导和Bayeux协议维护者]
虽然timeout
的定义是正确的,但interval
的定义是错误的。正确的定义是Bayeux协议规范here。
为清楚起见,您在上面提及的是" connect"实际上是/meta/connect
频道上的一条消息,它是Bayeux协议的心跳机制。
timeout
的含义是长轮询的本质。
在长轮询中,服务器在没有事件的情况下进行轮询以转发给客户端。服务器保留轮询的时间(同样,在没有事件的情况下)是timeout
参数指定的内容。
这就是为什么它是一个超时:它等待事件,如果没有,它会超时并回复客户端(带有空响应)。
timeout
参数通常在服务器上配置,但客户端可以覆盖它(在它发送的每个建议中以瞬态方式),服务器应该遵守客户端值。通常,这是由客户端实现完成的,而不是由应用程序完成的 - timeout
参数对于应用程序是不透明的。
interval
的含义是客户端在发出另一个/meta/connect
请求之前收到/meta/connect
回复后等待的时间。
可以在服务器和客户端上配置interval
参数。
这两个参数共同调整长轮询。
例如,您可以通过拥有(timeout=0, interval=3000)
对,每隔3秒简单地实现正常轮询。
服务器将看到客户端请求timeout=0
并且应该尊重它,以便它立即回复,即使没有可用的事件。
反过来,客户端将在发出另一个/meta/connect
请求之前等待3秒钟。
另一方面, long 轮询有例如(timeout=10000, interval=0)
对,如果没有,服务器最多持有/meta/connect
10秒转发给客户的事件。
重载服务器可以向客户端发送interval=500
的建议,以减少它处理的负载。在发出另一条/meta/connect
消息之前,所有客户端将在客户端等待500毫秒,从而为服务器提供恢复时间。
timeout
参数对TCP连接空闲超时有影响:如果timeout
太长,某些服务器(或网络组件)可能会在服务器有机会之前关闭TCP连接回复/meta/connect
。
Java Servlet容器永远不会关闭待处理请求的TCP连接(根据Servlet规范),但是配置为反向代理调用的Java Servlet容器前面的Apache | Nginx可能会早于{{1 }}
timeout
参数影响服务器应该在内存中维护一个似乎已经消失的客户端的会话。
如果interval
太大,服务器可能会使该客户端的会话失效。
如果QuarkIoE产品正如他们在文档中所说的那样解释interval
,那么它就违反了Bayeux协议。我认为这是一个文档错误。