1

根据http://cumulocity.com/guides/reference/real-time-notifications/发起握手以接收实时通知的客户端可以在其请求正文中包含建议。这个建议可以有一个超时(“发送连接消息和服务器响应之间的最大时间,以毫秒为单位。”)和一个间隔(“如果没有收到来自客户端的下一个连接消息,服务器将关闭会话的时间段。”) . 我不了解这些参数以及它们如何应用于我的长轮询连接。

  1. 为什么服务器会对客户端用于其连接调用的超时感兴趣?它应该在通知可用时立即发送通知(即“实时”)。正如预期的那样,确实如此。即使我指定了一个非常短的超时,但实际上为我的连接使用了更长的超时,我仍然会收到发生在这两个时间点之间的通知而没有任何问题。当我指定长时间超时时,无论如何我都会立即收到通知。延迟通知是有意义的,但我没有看到文档中提到这些。那么这个值是什么意思呢?
  2. 间隔的含义是什么?如果我指定一个较短的间隔,但在两次连续的连接调用之间等待更长的时间,那么服务器不会关闭会话”,如果这意味着我的 clientID 变得无效并且我需要进行新的握手。也许这只是保证的最短时间,服务器必须保持会话?即客户端希望被允许在连接之间等待的最长时间[并且等待更长的时间可能会或可能不会起作用,由服务器自行决定]?这也不是实际清除队列的时间,因为如果我在未连接时触发通知,并在间隔时间过去后重新连接,那么该通知仍然可以正常传递。

如果我们将其与 SmartREST 通知进行比较,我们会发现它应该以相反的方式工作,恕我直言,这更有意义:服务器将建议发送给客户端,告诉它应该如何配置自己。这种情况下的含义可能仍然有些模棱两可,但至少处理可能更直接(=按照服务器的建议做):

  1. 超时:不要使用较长的超时,因为服务器不希望保持连接打开的时间超过 X。不要使用较短的超时,因为服务器可能需要 X 时间来生成响应的所有通知。
  2. 间隔:不要比 Y 更快地重新连接,因为服务器内部通知分发甚至没有运行得那么快。在重新连接之前不要等待超过 Y,因为内部队列不会缓冲超过 Y 的通知。(在 CometD 参考中,这两个被命名为intervalmaxInterval,因此很明显它们是独立的。)

为什么两个场景的“建议方向”是相反的?我应该如何(如果有的话)将建议用于定期实时通知握手?

非常感谢您对此的任何澄清。

4

1 回答 1

2

[免责声明:我是 CometD 的负责人和 Bayeux 协议的维护者]

虽然 的定义timeout是正确的,但 的定义interval是错误的。正确的定义在 Bayeux 协议规范,这里

为了清楚起见,您上面所说的“连接”实际上是/meta/connect通道上的消息,这是贝叶协议的心跳机制。

的含义timeout是长轮询的本质。在长轮询中,轮询由服务器在没有事件中继到客户端的情况下进行。服务器保持轮询的时间(同样,在没有事件的情况下)是timeout参数指定的。这就是为什么它是超时的:它等待事件,如果没有,它会超时并回复客户端(响应为空)。

timeout参数通常在服务器上配置,但客户端可以覆盖它(在它发送的每个建议中以临时方式)并且服务器应该尊重客户端值。通常这是由客户端实现完成的,而不是由应用程序完成 -timeout参数对于应用程序是不透明的。

的含义是客户端在收到回复interval后等待多长时间再发出另一个请求。该参数可以在服务器和客户端上配置。/meta/connect/meta/connectinterval

这两个参数一起调整长轮询。

例如,您可以通过使用 pair 来简单地实现每 3 秒一次的正常轮询(timeout=0, interval=3000)。服务器将看到客户端请求timeout=0并且应该尊重它,因此它会立即回复,即使没有可用的事件。反过来,客户端将在发出另一个/meta/connect请求之前等待 3 秒。

另一方面,轮询具有例如 pair ,如果没有要中继给客户端的事件,(timeout=10000, interval=0)则服务器最多保持10 秒。/meta/connect

过载的服务器可能会向客户端发送建议interval=500以减少其处理的负载。所有客户端将在客户端等待 500 毫秒,然后再发出另/meta/connect一条消息,从而使服务器有时间恢复。

timeout参数对 TCP 连接空闲超时有影响:如果timeout太长,某些服务器(或网络组件)可能会在服务器有机会回复之前关闭 TCP 连接/meta/connect。Java Servlet 容器永远不会关闭待处理请求的 TCP 连接(根据 Servlet 规范),但是配置为反向代理调用的 Java Servlet 容器前面的 Apache|Nginx 可能会比timeout.

interval参数对服务器应在内存中为似乎已消失的客户端的会话保留多长时间有影响。如果interval太大,服务器可能会使该客户端的会话过期。

如果 Cumulocity 产品interval按照他们在文档中所说的那样进行解释,那么它违反了 Bayeux 协议。我宁愿认为这是一个文档错误。

于 2017-09-04T17:01:51.183 回答