如何避免 Akka HTTP 饱和(延迟峰值)?
How to avoid saturation in Akka HTTP (latency spikes)?
我有一个 akka-http (Scala) API 服务器为 NodeJS 服务器提供数据。
在启动后的瞬间,一切正常,一切都很快。延迟很低。但突然间,延迟迅速增加。 API 不再响应,网站变得无法使用。
奇怪的是流量和请求数保持稳定。延迟峰值似乎与它们无关。
我猜这种饱和是通过阻塞akka线程池中的所有线程来实现的。不幸的是,我的 Akka 调度程序正在阻塞,因为我正在做很多 SQL 查询(在 MySQL 中)并且因为我没有使用反应式库。我使用的是 Slick 2,与 Slick 3 相反,它只支持阻塞。
这是我的调度员:
http-blocking-dispatcher {
type = Dispatcher
executor = "thread-pool-executor"
thread-pool-executor {
fixed-pool-size = 46
}
throughput = 1
}
所以,我的问题是,如何避免这种装瓶?如何保持延迟与流量成正比?有没有办法驱逐导致饱和的请求,以防止它们破坏一切?
谢谢!
您不应将 Akka 自己的线程池用于 运行 宁长阻塞任务。创建您自己的线程池,并 运行 您使用它的灵活查询,为 akka 留出空闲线程。这是你的前 2 个问题。
我不知道最后一个有什么好的答案。您也许可以查看特定的灵活设置以在 sql 查询上设置超时,但我不知道这样的事情是否存在。否则尝试分析为什么您的查询花费这么多时间,您是否缺少一两个索引?
我有一个 akka-http (Scala) API 服务器为 NodeJS 服务器提供数据。 在启动后的瞬间,一切正常,一切都很快。延迟很低。但突然间,延迟迅速增加。 API 不再响应,网站变得无法使用。
奇怪的是流量和请求数保持稳定。延迟峰值似乎与它们无关。
我猜这种饱和是通过阻塞akka线程池中的所有线程来实现的。不幸的是,我的 Akka 调度程序正在阻塞,因为我正在做很多 SQL 查询(在 MySQL 中)并且因为我没有使用反应式库。我使用的是 Slick 2,与 Slick 3 相反,它只支持阻塞。 这是我的调度员:
http-blocking-dispatcher {
type = Dispatcher
executor = "thread-pool-executor"
thread-pool-executor {
fixed-pool-size = 46
}
throughput = 1
}
所以,我的问题是,如何避免这种装瓶?如何保持延迟与流量成正比?有没有办法驱逐导致饱和的请求,以防止它们破坏一切?
谢谢!
您不应将 Akka 自己的线程池用于 运行 宁长阻塞任务。创建您自己的线程池,并 运行 您使用它的灵活查询,为 akka 留出空闲线程。这是你的前 2 个问题。
我不知道最后一个有什么好的答案。您也许可以查看特定的灵活设置以在 sql 查询上设置超时,但我不知道这样的事情是否存在。否则尝试分析为什么您的查询花费这么多时间,您是否缺少一两个索引?