2017-01-31 8 views
1

AKKA-HTTP,spray-jsonおよびSlickを使用して、スカラーでREST APIを作成しました。ルートの承認のために、私はoauth2を使用しました。 (プレーンSQLを使用した)データを取得するためにAKKA-HTTP、spray-json、oauth2およびslickを使用してscala REST APIを最適化する方法は?

DAO:

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(スリック表):

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テーブルを使用するとパフォーマンスが低下するようですデータを取得する。

上記のルートのそれぞれの結果:

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とスリック表を使用してREST要求を最適化することができますか?

Slickテーブルと結合の代わりにPLAIN SQLを使用するとよいでしょうか?

答えて

0

oauth2を有効にすると、oauth2Authenticatorで実行されるネットワーク/サービスの呼び出しと比較して、akka httpで追加されるオーバーヘッドは無視できます。たとえそれが非同期で実行されたとしても、実行コンテキストを適切に設定する必要があります(良い読み取りExplaining AKKA Thread Pool Execturor Config parameters)。

Slickの部分に関しては、各リクエスト(暗黙的な行のプロパティ)に暗黙の行マッパーを宣言しているようです。 Compiled Queriesを見て、db接続プール構成で十分なjdbc接続を割り当てていることを確認してください。

このテストの全体概念はあまり有用ではないようですが、最低限の要件(例:最小100要求/秒)を持っていなければなりません。

+0

各リクエストに応じて、暗黙の行マッパーによって、あなたは '' userDao.getAll.map(U => u.toList)を意味しています。どの例やコードスニペットでも十分に分析できます。 :) – Sujit

+0

私は 'getAllNotes'メソッドの' implicit val getUserResult'を参照していました。代わりにクラスレベルで宣言できます。 –

+0

暗黙のうちに私はこれを置き換え、私が受け取った成果は '5926 rps'です。そして、 'getNotes()'でCompiledをどうすれば使えますか?私はdb.run(コンパイルされた(tableQ))を試しましたが、 'getAllNotes'の中にエラー – Sujit

0

部分に関しては、Slickが複数回回答されました。最新の回答はCache Slick DBIO Actions

平文Slickバージョンの応答時間を大幅に改善します。私もOAUTH2であなたを助けることができない

:/

関連する問題