【发布时间】:2021-03-01 22:16:27
【问题描述】:
CometD 3.1.4 java 实现使用一个缓冲区来跟踪传入的消息,该缓冲区的默认大小为 2MB。从断开连接重新启动时,可能会出现峰值并且您可能会超出限制。
图书馆有什么行为?字节丢失,如果收到来自服务器端的后续通知,可以处理它们吗?
【问题讨论】:
CometD 3.1.4 java 实现使用一个缓冲区来跟踪传入的消息,该缓冲区的默认大小为 2MB。从断开连接重新启动时,可能会出现峰值并且您可能会超出限制。
图书馆有什么行为?字节丢失,如果收到来自服务器端的后续通知,可以处理它们吗?
【问题讨论】:
可以按照here 的说明配置客户端缓冲限制。
但是,我建议您检查您的逻辑,因为通常不建议向客户端发送 MiB 消息,因为客户端可能需要很长时间才能处理所有消息。 此外,如果消息很少但数据很大,您可能需要设置一些东西,以便客户端获取带有下载 URI 的 CometD 消息,以便在侧面下载,而不是在 CometD 消息中发送数据。
话虽如此,您可以写一个server-side extension,例如,丢弃旧消息,这样您就不会在重新连接时发送 MiB 的数据。
message acknowledgment 扩展保证了服务器到客户端的传递,因此——只要你不超过客户端接收缓冲区——你可以保证排队的消息被传递到客户端。
您可能需要特定于您的应用程序的组合。 您可能需要server-side listener 来控制消息队列的大小、确认扩展以保证传递,并且可能需要更大的客户端缓冲区。
CometD 默认不这样做,因为每个人都想要不同的解决方案:有些人希望会话失败,有些人希望丢弃所有消息,有些人希望只保留最后的 N,等等。
CometD 为您提供实现逻辑所需的钩子。
【讨论】: