15

私はAkkaをいじっていて、私が念頭に置いている特定のものを実装する方法についてアドバイスが必要です。DownloadFile(URI, File)メッセージを送信してダウンロードできるアクターが必要です。これは並列化できるため、ファイルを次々とダウンロードしたくありませんが、同時ダウンロードの制限があります。

Akka でこのようなモデルを作成する意図は何ですか? 他に頭に浮かぶのは次のとおりです。「ワーカー」アクターの 1 人が何らかの理由で死亡した場合はどうなりますか? ダウンロードを再試行するにはどうすればよいですか? などなど

これは非常に大きな質問であることは承知していますが、誰かが時間を割いて答えてくれることを願っています! ありがとうございました!

4

2 に答える 2

24

これを試してみてください。3 つのダウンローダを作成しますが、好きなだけ作成するように構成することもできます。これにより、3 つのダウンロード要求を同時に処理できます。

sealed trait DownloaderMessage
case class DownloadFile(uri: URI, file: File) extends DownloaderMessage

object Downloader {
  val dispatcher = Dispatchers.newExecutorBasedEventDrivenWorkStealingDispatcher("pool").build
}

class Downloader extends Actor {
  self.lifeCycle = Permanent
  self.dispatcher = Downloader.dispatcher
  def receive = {
    case DownloadFile(uri, file) =>
      // do the download
  }
}

trait CyclicLoadBalancing extends LoadBalancer { this: Actor =>
  val downloaders: List[ActorRef]
  val seq = new CyclicIterator[ActorRef](downloaders)
}

trait DownloadManager extends Actor {
  self.lifeCycle = Permanent
  self.faultHandler = OneForOneStrategy(List(classOf[Exception]), 5, 5000)
  val downloaders: List[ActorRef]
  override def preStart = downloaders foreach { self.startLink(_) }
  override def postStop = self.shutdownLinkedActors()
}

class DownloadService extends DownloadManager with CyclicLoadBalancing {
  val downloaders = List.fill(3)(Actor.actorOf[Downloader])
}
于 2011-01-05T03:22:05.893 に答える
8

ダウンロードを管理する DownloadActor クラスを作成します. すべての DownloadActors が同じ Dispatcher を共有します. 必要に応じて Dispatcher を構成します (最大スレッド数, キュー サイズなど). すべての DownloadActors を同じスーパーバイザーにリンクします. 必要に応じてスーパーバイザーを構成します. (おそらく OneForOneStrategy)、新しいダウンロードごとに新しい DownloadActor を作成するか、適切な InfiniteIterator で LoadBalancer を使用してダウンロードを DownloadActors に配布します。

AsycHttpClient を使用してファイルをダウンロードすると、ダウンロード再開がサポートされます。

于 2011-01-04T16:06:38.673 に答える