与Hikari一起使用时,不需要使用更多连接

Ser*_*iGP 7 mysql scala slick hikaricp

我试图理解Slick-Hikari是如何工作的,我已经阅读了很多文档,但我有一个用例我的行为我不明白.

我正在使用Slick 3和Hikari,默认配置.我已经有一个同时连接〜1000个用户的生产应用程序.我的应用程序使用websockets,当我部署新版本时,所有客户端都重新连接.(我知道这不是处理部署的最佳方式,但我目前还没有集群.)当所有这些用户重新连接时,他们都开始进行查询以获得用户状态(狗堆效应).当它发生时Slick开始抛出很多错误,如:

java.util.concurrent.RejectedExecutionException: Task slick.backend.DatabaseComponent$DatabaseDef$$anon$2@4dbbd9d1 rejected from java.util.concurrent.ThreadPoolExecutor@a3b8495[Running, pool size = 20, active threads = 20, queued tasks = 1000, completed tasks = 23740]
Run Code Online (Sandbox Code Playgroud)

我认为它正在发生的是,待处理查询的光滑队列已满,因为它无法处理从数据库请求信息的所有客户端.但是,如果我看到Dropwizard提供给我的指标,我会看到以下内容:

观察到的Dropwizard指标的示例

16:45我们接近部署.在旧实例终止之前,我们可以看到连接数从20增加到40.我认为这是正常的,因为部署过程是如何完成的.

但是,如果由于狗堆效应导致Slick的查询队列变满,为什么如果有20个连接可用,它不会使用超过3-5个连接?数据库表现非常好,所以我认为瓶颈在于Slick.

您对改进此部署过程有什么建议吗?我现在只有1000个用户,但我会在几周内获得更多用户.

小智 0

基于“拒绝”异常,我认为许多 slick 操作同时提交给 slick,这超出了 slick 中嵌入的队列的默认大小(1000)。

所以我认为你应该:

  1. 增加队列大小(queueSize)以容纳更多未处理的操作。
  2. 增加 slick 中的线程数量(numThreads)以同时处理更多操作。 您可以在这里获得更多提示