3

異なるスケジュールで実行されるいくつかの Akka ジョブのセットがあります。最近、ディスクからファイルを読み取ってデータを処理する必要がある、1 日に 1 回実行するジョブをいくつか追加しました。ディスクからの読み取りはブロック操作であるため、私のコードは待機し、スケジュール操作が実行されるときにスケジュールされたジョブを実行しません。保留中のディスク IO 操作によってスケジューリング スレッドがブロックされないようにする方法を知っている人はいますか? 以下に、私のアクターの 1 つのコードを含めました。

スケジューラ コード:

lazy val system = akka.actor.ActorSystem("system")
lazy val emailActor = system.actorOf(Props[EmailActor], name = "EmailActor")

system.scheduler.schedule(3 hours, 24 hours)(emailActor ! System.currentTimeMillis)

アクターの実装:

class EmailActor extends Actor {
  override def receive = {
    case _ => EmailSyncer.process()
  }
}

プロセッサー:

def process() = {
  DataWarehouse.dataWarehouse withSession {
    val file = "/some/file/name"
    val emails = Try { Source.fromFile(file).getLines.map(l => Email(l)) }

    ...
  }
}
4

1 に答える 1

3

これは、Akka でよくある問題です。そして、それを解決するためのパターンはすぐに利用できます。「隔壁」を調べてください。あなたが何をする必要があるかを正確に示す以下のブログ投稿を含めました.

一般的な考え方は、さまざまなアクターをさまざまな実行コンテキストまたは俗語の「失敗ゾーン」に配置できるということです。これにより、リソースの枯渇やその他の問題がアプリの他の部分に波及するのを防ぐことができます。1 つの実行コンテキストだけが飢餓状態に陥り、他には何もありません。

各障害ゾーンの動作に基づいて、スレッド プールを異なる方法で調整することもできます。一般に、ブロック操作や計算集約型のスレッドの数が多い場合、コアごとに 1 つのスレッドを開始してそこから調整します。

幸運を。

http://letitcrash.com/post/40755146949/tuning-dispatchers-in-akka-applications

于 2013-11-14T19:56:35.820 に答える