12

REST 要求を受信し、データベースに対していくつかの操作を行い、クライアントにいくつかの情報で応答する Akka を使用する Scala アプリケーションがあります。現状では、DB に対して多くの操作を同時に実行できたとしても、DB 操作には長い時間がかかり、その間、REST 対応のアクターは新しい要求に応答できません。アクターで REST 対応メソッドに javax.ws.rs アノテーションを使用しています。

質問; アプリケーションが多数の同時リクエストを処理できるようにする最善の方法は何ですか?

編集:サンプルコードを追加します。

  import se.scalablesolutions.akka.actor._
  import javax.ws.rs._

  @Path("/test")
  class TestService {

    @GET
    def status() = 
      actorPool !! Status(session).
        getOrElse(<error>Unable to connect to service</error>)
  }

  class TestActor {

    def receive = {
      case Status() => {
        reply(SomeObject.slowDBMethod)
      }
    }
  }

  case class Status()

EDIT2:これは私がログに記録しているものです。タブを切り替えて F5 キーを押すのと同じ速さでブラウザーから 3 つの要求を送信していますが、RS Bean は最初の要求が完了するのを待ってから次の要求を処理します。

[INFO] [2010-08-29 16:27:03,232] [akka:event-driven:dispatcher:global-15] c.n.StatusActor: got Slow request
[INFO] [2010-08-29 16:27:06,916] [akka:event-driven:dispatcher:global-10] c.n.StatusActor: got Slow request
[INFO] [2010-08-29 16:27:10,589] [akka:event-driven:dispatcher:global-3] c.n.StatusActor: got Slow request
4

4 に答える 4

7

古いバージョンのAkkaを使用しているようです。

0.10(アクターとRS-Beanを分離する)にアップグレードすることをお勧めします。その後、LoadBalancer 1(および2)を使用してワークロードを調整するか、WorkStealingDispatcher 3(および4)を利用できます。

それは役に立ちますか?

于 2010-08-22T13:49:12.367 に答える
6

このスレッドが 4 か月以上前のものであることは認識していますが、Akka にはリクエストをアクターに効率的に転送する新しい HTTP モジュール実装があることに注意してください。このアプローチでは、非同期サーブレット API (Jetty の継続でも機能します) を利用して、中断された要求をシステムを介してメッセージとして渡し、いつでも再開できるようにします。たとえば、!! を使用する必要がなくなります。アクターの作業をトリガーし、注釈付き POJO で応答します。同様に、リクエストはコンテナー内で中断され、コンテキストは可能な限り迅速にアクターに切り替えられるため、レスポンスまたは将来の処理をブロックするスレッドはありません。

上記の例を今日書き直す単純な方法の 1 つ:

class TestEndpoint extends Actor with Endpoint {
   def hook(uri:String) = uri == "/test"
   def provide(uri:String) = actorOf[TestService].start

   override def preStart = {
     ActorRegister.actorsFor[classOf[RootEndpoint]).head ! Endpoint.Attach(hook, provide)
   }

   def receive = handleHttpRequest
}

class TestService extends Actor {
   def receive = {

     case get:Get => 
       get.timeout(SomeObject.TimeoutInSeconds) // for example
       get.OK(SomeObject.slowDBMethod)

     case other:RequestMethod =>
      other.NotAllowed("Invalid method for this endpoint")
   }
}

その他のドキュメントは akka サイトにあります: http://doc.akkasource.org/http

于 2010-12-21T19:55:52.530 に答える
3

リクエストを受け取ったら、そのリクエストを処理するための新しいアクターを作成する必要があります。元の送信者を渡して、新しく作成されたアクターが誰に応答するかを認識できるようにします。

于 2010-08-21T23:12:18.880 に答える
1

このスレッドは古いですが、Spiffy (プラグ!) をミックスに追加したいと思います:

https://github.com/mardambey/spiffy

スパイフィーとは?

スパイシー...

  • Scalaで書かれている
  • 素晴らしい Akka ライブラリとアクターを使用してスケーリングします
  • 非同期リクエスト処理にサーブレット API 3.0 を使用
  • モジュール式 (コンポーネントの交換は簡単です)
  • DSL を使用して、必要のないコードを削減します。
  • コントローラー周りのリクエストフックをサポート

Spiffy は、Scala、Akka (Scala アクターの実装)、および Java サーブレット 3.0 API を使用する Web フレームワークです。非同期インターフェイスを利用し、Web アプリケーションに非常に並列でスケーラブルな環境を提供することを目指しています。Spiffy のさまざまなコンポーネントはすべて、少量の作業を非常に迅速に実行し、要求をパイプラインの次のコンポーネントに渡す、独立した最小限のモジュールである必要があるという考えに基づいています。最後のコンポーネントがリクエストの処理を完了すると、リクエストを「完了」してクライアントに送り返すことで、サーブレット コンテナに通知します。

于 2011-03-30T01:54:26.647 に答える