如何使用 Spring WebSockets 和 Undertow 接收大于 16kB 的 WebSocket 消息

How to receive WebSocket messages larger than 16kB with Spring WebSockets and Undertow

我在使用 Spring Boot、Spring WebSocket 和 Undertow 接收大型子协议消息时遇到一些问题。消息在 16kB 后被截断。在做了一些挖掘之后,我发现以下配置 属性 似乎可以满足我的要求:

server.undertow.buffer-size=32768

在检查 /configprops 执行器端点时,此配置 属性 似乎已正确选取。不幸的是,这似乎对接收大于 16kB 的消息没有帮助。

我也从 Undertow 文档中偶然发现了这条不祥的线(强调我的):

For servers the ideal size is generally 16k, as this is usually the maximum amount of data that can be written out via a write() operation (depending on the network setting of the operating system).

这证实了我一直遇到的设置 server.undertow.buffer-size 无效的情况,因为它受到 OS 级别设置的限制。当我使用 Ubuntu Linux 时,我一直在摆弄 net.core.rmem_*net.core.wmem_* 设置,但这些设置似乎也没有任何效果。在 macOS.

上无法重现此问题

有谁知道如何配置 Undertow、Spring Boot、and/or Spring WebSocket 来支持这些消息?

我直接回答了上面的问题。我在 Spring Boot do 中建议的设置有效!我们遇到的问题是负载均衡器,在我们的例子中是 haproxy,在它前面正在切割 16kB 之后的消息。调整 haproxy 以允许更大的消息解决了这个问题。与此同时,我们调整了我们使用的协议以提高效率,因此我们不再需要这些大消息,因此我们的 haproxy 解决方案未在生产中测试 (YMMV)。

因为开发人员都在 macOS 和 Windows 上工作,并且问题只发生在 运行 Ubuntu 的验收和生产环境中,我们错误地认为这是原因。

经验教训(这些都是非常愚蠢和基本的,但我们还是犯了这些错误):

  • 一定要验证你所有的假设! 如果我们认为 Ubuntu 是我们应该在早些时候的测试中挑出 Ubuntu 的问题。例如,通过使用具有 Ubuntu 的虚拟机来验证我们在 qua运行taine.
  • 中的假设
  • 确保您的开发环境与您的生产环境相匹配! 在我们的开发环境中,我们没有 运行 haproxy。作为 "high level" 开发人员,我们倾向于将负载均衡器和 Web 服务器放在一边,将其作为商品基础设施,但此示例再次表明这些 "commodities" 可以非常直接地影响您的应用程序的工作。