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

时间:2016-12-29 13:54:18

标签: java ubuntu spring-boot haproxy undertow

使用Spring Boot,Spring WebSocket和Undertow接收大型子协议消息时遇到了一些麻烦。 16kB后消息被切断。在做了一些挖掘之后,我发现了以下配置属性,它看起来像我想要的那样:

function Figuri() {
  var playerCount = 50;
  this.players = [];
  for (var p=0; p<playerCount; p++){
    players.push(new Player());
  }
  figurkiNames.forEach(function(figura) {
  });
  for (var y = 1; y <= 2; y++) {
    for (var i = 0; i < 8; i++) {
      this.players[y].push(new Figurka(i, figurkiNames[i], y, i+1, 8))
    }
    for (var i = 8; i < 16; i++) {
      this.players[y].push(new Figurka(i, "peshka", y, i-7, 7))
    }
  }
}

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

我也偶然发现了Undertow文件中的这条不祥之处(强调我的):

  

对于服务器,理想大小通常为16k,因为通常是可通过write()操作写出的最大数据量(取决于操作系统的网络设置)

这确认了我所遇到的设置server.undertow.buffer-size=32768 无效,因为它受操作系统级别设置的限制。当我使用Ubuntu Linux时,我一直在摆弄server.undertow.buffer-sizenet.core.rmem_*设置但这些似乎也没有任何效果。在macOS上无法重现此问题。

有谁知道如何配置Undertow,Spring Boot和/或Spring WebSocket来支持这些消息?

1 个答案:

答案 0 :(得分:0)

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

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

经验教训(这些都非常愚蠢和基本,但无论如何我们犯了这些错误):

  • 请务必验证您的所有假设!如果我们认为Ubuntu是问题,我们应该在之前的测试中挑出Ubuntu。例如,通过使用具有Ubuntu的VM来验证我们在quarantaine中的假设。
  • 确保您的开发环境与您的生产环境相匹配!在我们的开发环境中,我们没有运行haproxy。作为“高级”开发人员,我们倾向于将负载均衡器和Web服务器作为商品基础架构,但这个例子再一次表明这些“商品”可以直接影响您的应用程序的运行。