扩展Play 2.7.x(使用Akka HTTP Server)以支持大量并发SSE连接

7hiiyaii  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(162)

我们在Play Framework 2.7.x中遇到了一个问题,在这个用例中,我们试图通过SSE事件流为大量并发客户端提供服务。
从Play 2.4.x升级到Play 2.7.x后,我们开始看到这个问题,其中引入的主要变化是引入Akka HTTP作为默认HTTP服务器,并使用Akka流替换Iteratees以提供Play EvenSource
至于流实现(我们之前的迭代者实现的替代方案),我们已经尝试了两种不同的实现
使用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-),后者被明确提到是扩展的关键参数。
我们在我们的测试环境中运行了两个Play示例。由此我们得出结论,在默认设置下,存在2048个并发连接的限制。显然,我们希望在单个节点上大幅扩展,以容纳更多的用户,就像LinkedIn正在做的那样。
LinkedIn博客不必提到最大连接数,因为这篇文章是在Netty仍然是Play下的默认HTTP服务器的时候写的。
然而,今天Akka HTTP已经成为默认的HTTP服务器,并且它的最大连接数的默认值似乎只有1024。
因此,我们决定增加此默认值,但不知何故,我们有一种印象,即任何尝试应用此更改的操作要么没有应用,要么仍然存在一些其他隐藏的限制,阻止我们进行扩展。
在Play文档中,我们发现只有默认AKKA http参数的一个子集可以更改(https://www.playframework.com/documentation/2.7.x/SettingsAkkaHttp)。令我们惊讶的是,最大连接数参数没有在Play配置中列出。我们尝试如下所述设置参数

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是这种用例的唯一有效选项吗?我们是否遗漏了其他东西?提前感谢您的思考。

ar5n3qh5

ar5n3qh51#

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

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

相关问题