如何使用AKKA-HTTP,spray-json,oauth2和slick来优化scala REST api?

时间:2017-01-31 11:11:32

标签: scala rest akka-http slick-3.0

我使用AKKA-HTTPspray-jsonSlick在scala中创建了一个REST API。对于路由授权,我使用了oauth2

DAO检索数据(使用纯SQL):

def getAllNotes: Future[Seq[UserEntity]] = {
    implicit val getUserResult = GetResult(r => UserEntity(r.<<, r.<<, r.<<, r.<<, r.<<, r.<<))
    query(s"select id, email, password,created_at, updated_at, deleted_at from users", getUserResult)
}

DAO检索数据(Slick Table):

def getAll(): Future[Seq[A]] = {
    db.run(tableQ.result)
}

这是路由的一部分:

val route: Route = pathPrefix("auth") {
    get {
        path("tests") {
            complete(userDao.getAll.map(u => u.toList))
        } ~
        path("test") {
            complete(userDao.getAllNotes.map(u => u.toList))
        } ~
        path("testUsers") {
            baseApi(userDao.getAllNotes)
        } ~
        path("users") {
            baseApi(userDao.getAll())
        }
    }
}

implicit def baseApi(f: ToResponseMarshallable): Route = {
    authenticateOAuth2Async[AuthInfo[OauthAccount]]("realm", oauth2Authenticator) { auth =>
        pathEndOrSingleSlash {
            complete(f)
        }
    }
}

从功能上讲,所有路由都按预期工作,但当OAUTH2和Slick Tables用于获取数据时,性能似乎有所下降。

以上路线的各自结果:

1. "users"     => 10 request per second: OAUTH2: YES, Slick Table: YES
2. "testUsers" => 17 request per second: OAUTH2: YES, Slick Table: NO
3. "tests"     => 500 request per second: OAUTH2: NO, Slick Table: YES
4. "test"      => 5593 request per second: OAUTH2: NO, Slick Table: NO

我的问题

如何使用OAUTH2和Slick Table优化REST请求?

如果我在所有情况下都使用PLAIN SQL而不是Slick表和连接,这是不错的做法?

2 个答案:

答案 0 :(得分:0)

似乎启用Oauth2的影响最大,但是与oauth2Authenticator上执行的网络/服务调用相比,akka http增加的开销可以忽略不计。即使以异步方式完成,您仍需要正确配置执行上下文(好读Explaining AKKA Thread Pool Execturor Config parameters)。

关于Slick部分,似乎您在每个请求上声明了隐式行映射器(可以是类val属性)。 查看Compiled Queries并确保在数据库连接池配置中分配足够的jdbc连接。

在任何情况下,这个测试的整个概念似乎都没有用,一个应该有最低要求(例如:最少100个请求/秒),然后开始构建。

答案 1 :(得分:0)

有关 WAGTAILSEARCH_BACKENDS = { 'default': { 'BACKEND': 'wagtail.wagtailsearch.backends.elasticsearch2', 'URLS': ['https://www.santanderconsumerbank.be'], 'AUTO_UPDATE': False, 'ATOMIC_REBUILD': True, 'INDEX': 'santander-consumer-benelux', 'TIMEOUT':5, }, } 的部分已多次回答。最近的答案在这里:Cache Slick DBIO Actions

这应该可以显着缩短普通Slick版本的响应时间。

我无法帮助你Slick:/