gpt4 book ai didi

scala - REST (Squeryl/Akka/Spray) - 非常低的吞吐量

转载 作者:行者123 更新时间:2023-12-05 00:24:34 25 4
gpt4 key购买 nike

我目前正在构建我的第一个 REST API,它基于一个 RSS 聚合器。我使用 MemoryBasedDB 或 PostgresDB 这两个特征之一来实现它。在每次访问根 url 时,它都会对提要进行异步调用以获取最新文章,并将其作为 XML 字符串返回以进行解析。解析后作为 Article 对象保存在数据库中。

从功能上讲,这对我来说都很好。但是,当使用 weighttp 或 gatling 进行负载测试时,它将在 1k 请求/1k 并发用户下使用 Postgres 失败,如下所示:

在 weighttp 中:

error: read() failed: Connection reset by peer (104)

在我的服务器日志中:
final [WARN] [09/21/2014 14:45:27.224] [on-spray-can-akka.actor.default-dispatcher-36] [akka://on-spray-can/user/IO-HTTP/listener-0/523] Configured registration timeout of 1 second expired, stopping

我相信这与我的查询布局方式有关。它们处于阻塞状态,并且由于每个参与者都必须等待响应,它们背后的负载越来越高,直至故障点(超时)。但是,在我的研究中,我只能找到 this postgres 的异步驱动程序,目前与 Squeryl 不兼容(据我了解)。

如何使数据库访问更快?目前,我使用 Postgres 实现了 ~10-15req/s,使用内存持久性实现了 ~400req/s。

我的模型:
case class Article(id: Option[String], idint: Option[Int], title: String, author: String, published: String, updated: String, `abstract`: Option[String], content: Option[String], link: Option[String])

我的疑问:
trait PostgresDB extends Schema {

val articles = table[Article]("articles")
on(articles)(e => declare(e.idint is(unique)))

def create(x: Article) = inTransaction {
articles.insert(x)
}

def getAll: Set[Article] = inTransaction {
from(articles)(article => select(article)).toSet
}

def getArticle(x: Int) = inTransaction {
from(articles)(article => where(article.idint === Some(x)) select(article)).toList(0)
}

def printy = transaction {
articles.schema.printDdl(println(_))
}
}

到目前为止,我已经尝试过:
  • 为连接池实现 C3P0。没有真正的改变。
  • 调整 postgresql.conf 以提高性能。小的积极变化。
  • 为喷涂/akka 调整 application.conf 以提高性能。小的积极变化。

  • 相关资料:
  • 核心:
  • Linux 3.13.0-33-generic#58-Ubuntu SMP 2014 年 7 月 29 日星期二 16:45:05 UTC x86_64 x86_64 x86_64 GNU/Linux
  • Postgres 9.3
  • 斯卡拉 2.10.4
  • 喷雾 1.3.1
  • 阿卡 2.3.5
  • 最佳答案

    是的,我同意@experquiste,为数据库参与者提供自己的调度程序,并将其线程池大小和参与者数量调整为您的数据库可以处理的并发请求数。在此前面放置一个路由器。您应该测量数据库服务器磁盘队列长度。这在持续的高负载下应该是稳定的,不断添加线程直到队列开始增长。

    另一种方法是为您的数据库访问层使用线程池和 future 。它似乎更容易配置,但缺乏监督和错误恢复。
    http://www.chrisstucchio.com/blog/2013/actors_vs_futures.html就我个人而言,我仍然使用 Actor 进行并发。

    我从未使用过 squeryl,inTransaction block 是否创建数据库事务?您显示的数据库特征似乎不需要事务,您是否尝试过没有它们。

    关于scala - REST (Squeryl/Akka/Spray) - 非常低的吞吐量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25963270/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com