微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于大量并发 SSE 连接的 Scaling Play 2.7.x使用 Akka HTTP Server

如何解决用于大量并发 SSE 连接的 Scaling Play 2.7.x使用 Akka HTTP Server

我们在 Play Framework 2.7.x 中遇到了一个用例,即我们尝试使用 SSE 事件流为大量并发客户端提供服务。

从 Play 2.4.x 升级到 Play 2.7.x 后,我们开始看到这个问题,其中引入的主要变化是引入 Akka HTTP 作为认 HTTP 服务器,并用 Akka 流替换 Iteratees 以提供 Play EvenSource

至于流实现(我们之前的 Iteratees 实现的替代方案),我们已经尝试了 2 种不同的实现

使用 Akka Streams broadcastHub 使用普通参与者(基于 LinkedIn 团队使用的参考实现) 目前,我们认为流的两种实现都不是问题,但问题是 Akka HTTP 服务器中的认限制引入的,我们似乎无法调整以发挥我们的优势。

我们注意到认情况下 Akka HTTP 服务器具有以下值

akka.http.server.max-connections = 1024
akka.http.server.backlog = 100

我在 2016 年一些 LinkedIn 工程师 (https://engineering.linkedin.com/blog/2016/10/instant-messaging-at-linkedin--scaling-to-hundreds-of-thousands-) 的博客中提到了上述设置,后者被明确提及为扩展的关键参数。

我们在测试环境中运行了 2 个 Play 实例。由此我们得出结论,在认设置下,存在 2048 个并发连接的限制。显然,我们希望在单个节点上大幅扩展,以容纳更多用户,就像 LinkedIn 所做的那样。

LinkedIn 的博客没有提到最大连接数,因为这篇文章是在 Netty 仍然是 Play 下的认 HTTP 服务器的时候写的。

然而,今天 Akka HTTP 已经成为认的 HTTP 服务器,并且它的最大连接数的认值似乎只有 1024。

因此,我们决定增加这个认值,但不知何故,我们有这样的印象,即应用此更改的任何尝试要么未应用,要么以某种方式仍有一些其他隐藏的限制阻止我们扩大规模。

在 Play 文档中,我们发现只能更改认 AKKA http 参数的一个子集 (https://www.playframework.com/documentation/2.7.x/SettingsAkkaHttp)。令我们惊讶的是,Play 配置并未列出 max-connections 参数。我们尝试设置如下所述的参数

play.server.akka.max-connections = <higher_value>
play.server.akka.backlog = <higher_value>

这似乎没有任何影响。

我们应用的一个并行更改是在我们正在使用的 play.akka.config 部分中添加这些参数。

play.akka.config = “play-akka”

play-akka {
http.server.max-connections = <higher_value>
http.server.backlog = <higher_value>
}

不幸的是,一旦我们的测试程序超过基于认设置的假定最大限制 (2 x 1024 = 2048),我们仍然会看到我们的 HTTP 服务器停止运行。

当我们在旧软件(下面是 Netty)上运行相同的负载测试时,一切正常。

我们现在正在摸索以下问题

我们这样做正确吗? 有人可以根据自己的经验告诉我们 Akka HTTP 服务器是否存在我们无法控制的限制? Netty 是这种用例的唯一有效选项吗? 我们错过了什么吗? 在此先感谢您的考虑。

解决方法

我们只需要使用下面的配置,它就是这样工作的。这是目前的解决方案。您可以找到讨论 here

akka.http.server {
max-connections = <higher_value>
backlog = <higher_value>
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。