【问题标题】:What is the behaviour of CometD implementation that use a synchronous buffer when the buffer is empty?当缓冲区为空时,使用同步缓冲区的 CometD 实现的行为是什么?
【发布时间】:2021-03-01 22:16:27
【问题描述】:

CometD 3.1.4 java 实现使用一个缓冲区来跟踪传入的消息,该缓冲区的默认大小为 2MB。从断开连接重新启动时,可能会出现峰值并且您可能会超出限制。

图书馆有什么行为?字节丢失,如果收到来自服务器端的后续通知,可以处理它们吗?

【问题讨论】:

    标签: java cometd


    【解决方案1】:

    可以按照here 的说明配置客户端缓冲限制。

    但是,我建议您检查您的逻辑,因为通常不建议向客户端发送 MiB 消息,因为客户端可能需要很长时间才能处理所有消息。 此外,如果消息很少但数据很大,您可能需要设置一些东西,以便客户端获取带有下载 URI 的 CometD 消息,以便在侧面下载,而不是在 CometD 消息中发送数据。

    话虽如此,您可以写一个server-side extension,例如,丢弃旧消息,这样您就不会在重新连接时发送 MiB 的数据。

    message acknowledgment 扩展保证了服务器到客户端的传递,因此——只要你不超过客户端接收缓冲区——你可以保证排队的消息被传递到客户端。

    您可能需要特定于您的应用程序的组合。 您可能需要server-side listener 来控制消息队列的大小、确认扩展以保证传递,并且可能需要更大的客户端缓冲区。

    CometD 默认不这样做,因为每个人都想要不同的解决方案:有些人希望会话失败,有些人希望丢弃所有消息,有些人希望只保留最后的 N,等等。

    CometD 为您提供实现逻辑所需的钩子。

    【讨论】:

    • 我不控制服务器,只控制客户端。如果缓冲区太小,您是否确认客户端会丢失通知?
    • 如果服务器发送大量消息或超过配置的最大消息大小的大量消息,客户端将丢失消息。任何运输都会发生这种情况,例如浏览器对 WebSocket 消息的限制是几 KiB(不像你的情况那样 MiB)。您需要联系服务器应用程序提供商,要求他们发送较小的批次。如果您使用 HTTP 传输,您可以在客户端上配置一个非常大的最大消息大小。
    猜你喜欢
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    相关资源
    最近更新 更多