我使用AKKA-HTTP
,spray-json
和Slick
在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表和连接,这是不错的做法?
答案 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
:/