Akka俳優:いくつかの基本を理解するために例が必要です
-
15-10-2019 - |
質問
私はAkkaをいじくり回していますが、私が念頭に置いている特定の何かを実装する方法をアドバイスする必要があります。送ることができる俳優が欲しい DownloadFile(URI, File)
メッセージとダウンロード。これは並行することができるので、ファイルの後にファイルをダウンロードしたくありませんが、同時ダウンロードの制限があります。
Akkaでこのようなものをモデル化する意図された方法は何ですか?頭に浮かぶ他のことは、「労働者」俳優の一人が何らかの理由で死ぬとどうなりますか?ダウンロードを再試行する方法は?など
私はこれが非常に大きな質問だと知っていますが、誰かがそれに答えるのに時間がかかることを願っています!ありがとうございました!
解決
これを試してください。 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])
}
他のヒント
ダウンロードを管理するダウンロードアクタークラスを作成し、すべてのダウンロードアクターに同じディスパッチャーを共有し、ニーズ(最大スレッド、キューサイズなど)に応じてディスパッチャーを構成し、すべてのダウンロードアクターを同じスーパーバイザーにリンクし、ニーズに応じてスーパーバイザーを構成します(おそらくOneForOnestrategy)、新しいダウンロードごとに新しいダウンロードアクターを作成するか、適切なInfiniteTeratorを備えたLoadbalancerを使用してダウンロードをダウンロードアクターに配布します。
asychttpclientを使用してファイルをダウンロードすると、ダウンロードresumeがサポートされます。